如何在第一次启动前更改elpa源?

使用一些Github上的配置的时候老遇到天朝特色的事情。我又不想挂代理,所以只能更改软件源。 但是在哪儿改比较好?如果直接改init-elpa.el的话,下次pull的时候就会出错……

https://elpa.emacs-china.org/

我是说,像那种其他人的已经成套的配置,这个地址该往什么地方加比较好点。

你还是得要修改你用的配置,总不至于别人的配置也会为你考虑。

那你就得找到别人成套配置的定义在哪,如果没有你就可以直接写你自己的.

也就是只好等更新合并的时候,再把那文件恢复原样儿? 因为git我还真的不太会用,不知道怎么强制合并更新……只要有文件改动,就会停止合并。

编辑.emacs ,在里面(load “~/.emacs.d/init.el”) 加载之前配置源。

学git, 第一,大部分情况下,init-elpa.el 不太经常修改,所以你就算自己改了问题也不大 第二, merge confict时,用方便的merge tool 进行冲突合并,比如: .gitconfig:

[difftool.ediff]
	cmd = emacsclient --alternate-editor="" -s workspace0 -nw --eval \"\
	       (progn\
	        (winner-mode 1)\
     	    (add-hook 'ediff-after-quit-hook-internal (lambda ()\
	          (progn\
	            (winner-undo)\
	            (delete-frame))))\
        	(ediff-files \\\"$LOCAL\\\" \\\"$REMOTE\\\"))\"
[diff]
	tool = ediff
[difftool]
	prompt = false
[mergetool.ediff]
	cmd = emacsclient --alternate-editor="" -s workspace0 -nw --eval \"\
           (progn\
        	(defun ediff-write-merge-buffer ()\
            	(let ((file ediff-merge-store-file))\
	             (set-buffer ediff-buffer-C)\
	             (write-region (point-min) (point-max) file)\
	             (message \\\"Merge buffer saved in: %s\\\" file)\
	             (set-buffer-modified-p nil)\
	             (sit-for 1)))\
	        (winner-mode 1)\
	        (add-hook 'ediff-after-quit-hook-internal (lambda ()\
	             (progn\
                 	(winner-undo)\
	                (delete-frame))))\
	        (setq ediff-quit-merge-hook 'ediff-write-merge-buffer)\
	        (ediff-merge-files-with-ancestor \\\"$LOCAL\\\" \\\"$REMOTE\\\"\
	                                         \\\"$BASE\\\" nil \\\"$MERGED\\\"))\"
[merge]
	tool = ediff

我的 emacs 开机启动一个名为 workspace0 的daemon,在gitconfig中添加上述语句后在merge confict时只需要 git mergetool就会自动用 ediff 打开冲突文件,左上角本地版本,右上角远程版本,下方最终版本,a/b选择使用哪个版本,n为下一个冲突位置,实在需要手动merge的部分就点击第三个buffer手动修改,修改结束按 q直接保存退出。全部更改结束后使用 find . -name "*.orig" -delete命令删除冲突文件,然后重新 git add .``git commit就可以了

1 个赞

另外厚颜无耻地推一发我自己的配置

定期合并 陈斌 的配置,elpa用的是清华的源 README 很不完善,心情好时才修改一下 :joy:

即使你修改了 init-elpa.el,还是有其它的 package 会捣乱:(就像很多 package 会硬编码直接使用 ~/.emacs.d 一样)

└⋊> ag -Q "(add-to-list 'package-archives" ~/.emacs.d/elpa-25.2.1/
/Users/gqj/.emacs.d/elpa-25.2.1/epl-20150517.433/epl.el
192:  (add-to-list 'package-archives (cons name url)))

/Users/gqj/.emacs.d/elpa-25.2.1/gnuplot-mode-20151122.2339/gnuplot-mode.el
31:;; (add-to-list 'package-archives

/Users/gqj/.emacs.d/elpa-25.2.1/ivy-20170321.1047/ivy.info
251:     (add-to-list 'package-archives

/Users/gqj/.emacs.d/elpa-25.2.1/markdown-mode-20170317.1202/markdown-mode.el
79:;;     (add-to-list 'package-archives

我的做法是:

  • 把墙内的源放在 ~/.elpa.el,如果该文件不存在,说明不受墙的影响,也就没有以下步骤
  • 每次 (pacage-refresh-contents) 之前,用 ~/.elpa.el 的源覆盖 package-archives (原因就是上面说的,有些 package 会乱插)
  • 我自己使用 (package/add-source ...) 添加源:如果 ~/.elpa.dl 不存在,就添加到 package-archives

也许每次覆盖 package-archives 是有些损耗,但是远小于去刷新不存在的源。

1 个赞

我用的是purcell的配置,因为水平不够,并且讨厌evil的快捷键。 我自己找了个笨办法……………… 自己写一个init-elpa备着,如果有啥意外需要重做emacs,在 clone之后,把purcell配置的init-elpa备份,然后把自己的那个放进去,完成首次启动。 首次启动结束之后,把.emacs.d里那个自己的init-elpa删了,换回那份配置默认的init-elpa,把源加入custom.el里面…… 这样我这个强迫症的实际需求,就满足了……别喷,

总之谢谢各位的解答……我感觉我还需要学很多东西啊……

他的README里有写如何添加自定义配置,自己加一个自定义配置就行了.

Adding your own customization

To add your own customization, use M-x customize and/or create a file~/.emacs.d/lisp/init-local.el which looks like this:

... your code here ...

(provide 'init-local)

If you need initialisation code which executes earlier in the startup process, you can also create an~/.emacs.d/lisp/init-preload-local.el file.

If you plan to customize things more extensively, you should probably just fork the repo and hack away at the config to make it your own! Remember to regularly merge in changes from this repo, so that your config remains compatible with the latest package and Emacs versions.

Please note that I cannot provide support for customised versions of this configuration.

然后在他的配置的init.el的第153行有:

;;----------------------------------------------------------------------------
;; Allow users to provide an optional "init-local" containing personal settings
;;----------------------------------------------------------------------------
(require 'init-local nil t)

但是这是在“首次启动”之后才能生效的啊(实测)。 所以还是改init-elpa比较靠谱点……

因为 init-elpa 起效更早 (34行)而init-local在153行 而 init-elpa 第92行 (package-initialize)就开始自动下载packages了

不过我看 purcell 的 init-elpa里似乎也没有几个包?(没细看,可能其他地方也有吧)

上面提供了几个mirror 似乎可用

你把它往上挪挪地方不就行了,那个init.el是从上往下执行的

问题应该是 init-elpa里面设置了 melpa 源,如果它不想改 init-elpa,从 init.el里说确实是个死局

:sweat:我竟然不知道elisp是从上往下执行的……真是见笑了……

他的配置在昨天改了,主要的包放在以“elpa-emacs版本号”命名的文件夹里。