如何在更改.emacs文件后重新加载它?

434

在不重新启动 Emacs 的情况下,如何让 Emacs 重新加载我在 .emacs 中更新的所有定义?


23
我知道Emacs经常被认为是一个操作系统,但是...s/reboot/restart/? - William Pursell
8
我不是开发者,因此很多对开发者来说显而易见的答案对我来说并没有那么重要。 - yazzapps.com
9
@MJB,Stack Overflow的目的是成为一个知识库,即使是最基本的问题也可以在此找到答案。这个问题完全符合Stack Overflow的目的。请参见http://stackoverflow.com/faq - chollida
5
可能是重复的问题,与 http://stackoverflow.com/questions/2281593/how-can-i-load-changes-to-my-emacs-without-rebooting-emacs 相似。 - Trey Jackson
14
哈哈,现在五年过去了,建议先“谷歌搜索”,就会跳转到这里!不错。 - JimLohse
显示剩余5条评论
18个回答

407
你可以使用命令load-file (M-x load-file),然后按两次Return接受默认文件名,该文件名为当前正在编辑的文件。你也可以将光标移动到任何Sexp的末尾,然后按下C-xC-e来执行该Sexp。如果只更改一行或两行,通常不需要重新加载整个文件。

23
请记住,这个操作可能并不总是像你想象的那样运作。如果你有变量内容被翻转了(比如将布尔值设置为它的相反值),那么它的行为就不同于加载文件。 - chollida
4
通常来说,任何副作用都可能破坏期望的行为,例如加载文件等。 - deprecated
当我这样做时,我收到以下消息:load-with-code-conversion: Symbol's value as variable is void: n - Chris Marie
5
除了将光标移到“defun”或“defvar”后面,您还可以将其保留在声明体内,并键入“C-M-x”。非常方便。 - Thomas
那么,使用M-x load-file命令加载~/.emacs文件来替代默认设置如何? - young_souvlaki

182

非常方便的方法是

M-x eval-buffer

它会立即执行缓冲区中的所有代码。如果你的.emacs文件是幂等的,这是最快的方法。


4
谁说.emacs必须是幂等的(idempotent)? - mike
2
@mike:不是我。"给定a,b为true"是针对我的,但我能理解你的意思。为了更清晰明了,我将“given”改为“if”。 - Peter
8
什么情况下 .emacs 不满足幂等性? - Zaz
2
我不会说这是好的风格,但这种情况可能会发生。例如,如果一个函数已经被定义了(从第一次启动开始),你可以选择不重新定义它。当评估你的 init 文件时,你可能看不到它的定义发生变化。 - Kaligule
1
有用的函数是eval-buffereval-defun。我将它们分别绑定到C-c C-k和C-c C-c上(与SLIME相同)。我很少实际评估整个缓冲区,通常只评估我正在处理的函数或定义。 - George Kettleborough
显示剩余3条评论

48

通常情况下,您只需要重新评估更改的区域。标记您已更改的~/.emacs区域,然后使用M-x eval-region RET. 与重新评估整个文件相比,这通常更安全,因为加载两次后,很容易编写不完全正确的.emacs文件。


2
有趣。我从未考虑过一个不是幂等的.emacs文件的想法。当我开始使用ELisp时要注意这一点。 - Erik
2
我猜很少能找到一个在强意义下两次执行会产生完全相同状态的.emacs文件。至少,在各种列表中常常以不抑制重复条目的方式添加,这样执行第二次时就会导致不同的结果。 - Dale Hagglund
1
另一个想法:使用我上面建议的方法,可能你现在使用的emacs状态并不是你的.emacs文件实际执行的状态。也就是说,由于你没有从干净的状态下执行整个.emacs文件,你并不真正知道它是否按照你的意愿执行。 - Dale Hagglund
1
话虽如此,难道不能以幂等的方式编写.emacs吗?全局状态很棘手。 - Ehtesh Choudhury

47

如果您在当前活动缓冲区中打开了您的.emacs文件:

 M-x eval-buffer 

13
需要注意的是,采用这种方法可能不会使您处于与重新启动方法完全相同的状态。(举个例子:如果在.emacs文件中有一个“切换”效果)。 - luapyad

33

解决方案

M-: (load user-init-file)


注释

  • Eval:提示符中输入它(包括括号)
  • user-init-file是一个变量,它默认保存~/.emacs的值(指向配置文件路径)
  • (load)(load-file)的缩写、旧版本和非交互式版本;它不是Emacs命令(要在M-x中键入),而只是一个Elisp函数

结论

M-: > M-x


2
M-: > Ctrl Alt x 是基于你的逻辑吗?如果仅更改初始化文件中的一行,我想 M-: < C-M-x, 或许只是等于 ==。 - Robert Houghton

30
M-x load-file
~/.emacs

2
通过这个过程,我了解到在我的Windows 7安装中,.emacs.d文件夹位于%appdata%文件夹而不是用户主文件夹中。 - Bassdrop Cumberwubwubwub

15

其他人已经按照所述回答了你的问题,但我发现我通常希望执行刚刚编写的行。

为此,在Elisp部分中使用Ctrl + Alt + X就可以了。


3
请参阅eval-lastsexp,快捷键为C-x C-e - Derek Slager
使用 C-M-x,你不必在 "lisp 的结尾" -- 也许你想到的是 C-x C-eC-M-x 的好处是即使光标在函数/变量声明的中间,你也可以调用它。 - Thomas
我可能养成了只使用C-x C-e的习惯,所以会一直到达lisp的末尾。感谢指出! - Bahbar

13
以下应该可以做到...
M-x load-file

12

我建议你一开始不要这样做。相反,启动一个新的Emacs会话并测试你所做的任何更改是否能正常工作。这么做的原因是避免让你处于一个无法使用的.emacs文件状态,它可能无法加载或无法顺利地加载。如果你在原始会话中进行所有编辑,在新会话中进行所有测试,那么你将始终拥有可靠的东西来注释掉有问题的代码。

当你最终对你的更改感到满意时,然后使用其他答案之一重新加载。我的个人偏好是仅eval已添加/更改的部分,这可以通过高亮显示添加/更改代码区域并调用M-x eval-region来完成。这样做可以最小化评估的代码,从而使任何意外副作用最小化,正如luapyad 指出的那样


10

键盘快捷键:

(defun reload-init-file ()
  (interactive)
  (load-file user-init-file))

(global-set-key (kbd "C-c C-l") 'reload-init-file)    ; Reload .emacs file

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接