更改后如何重新加载.emacs?


375

我如何才能使Emacs重新加载所有更新的定义,.emacs而无需重新启动Emacs?


18
我知道emacs通常被认为是一个操作系统,但是... s / reboot / restart /?
威廉·珀塞尔

6
我不是开发人员,因此对开发人员来说立即有意义的很多答案对我来说意义不大
Yazz.com 2010年

4
@MJB Stack Overflow的目的是成为甚至最基本问题的知识库。这个问题完全符合堆栈溢出的目的。请访问stackoverflow.com/faq
chollida 2010年


10
哈哈现在五年后,建议的“ Google搜索优先”在这里引人注目!不错
JimLohse

Answers:


350

您可以使用命令load-file(M-x load-file,然后按两次return键以接受默认文件名,即正在编辑的当前文件)。

您也可以将点移动到任何sexp的末尾,然后按C-xC-e即可执行该sexp。通常,如果只更改一两行,则不必重新加载整个文件。


22
请记住,这可能并不总是完全按照您的想法做。如果您的变量的内容被翻转(即,将布尔值设置为相反),则行为将与加载文件不同。
chollida 2010年

4
一般而言,任何的副作用有可能打破所需的行为:加载文件等
vemv

当我这样做时,我得到消息:加载代码转换:Symbol的变量值无效:n
Chris Marie 2015年

2
除了将点移动到defunor 后面defvar,也可以将其保留在声明主体中并键入C-M-x。非常便利。
托马斯

151

很奇怪,很方便

M-x eval-buffer

这里没有提到。

如果您.emacs是幂等的,它将立即评估缓冲区中的所有代码,这是最快的方法。


3
谁说这.emacs是(或必须是)幂等的?
mike 2015年

@mike:不是我。“给a,b为真”对我来说意味着“如果a,b为真”,但我可以理解您的意思。为了更清楚,我更改了if。
彼得

7
@mike:什么时候 .emacs不成为幂等?
Zaz

我本以为这是第一个建议。
Stryker

1
我不会说这是好的风格,但是可能会发生。例如,您可以选择不重新定义已定义的功能(从第一次启动开始)。评估您的初始化文件时,您可能看不到其定义的更改。
Kaligule

43

通常,您只需重新评估更改的区域即可。标记〜/ .emacs的区域,然后使用M-x eval-region RET。这通常比重新评估整个文件更安全,因为编写.emacs文件很容易,该文件在两次加载后无法正常工作。


2
有趣。我没有考虑过不是等幂的.emacs文件的想法。当我开始使用ELisp时需要注意的事情
Erik

2
我想这是难得找到一个.emacs文件即幂等,至少造成完全相同的状态为一个执行两次执行的强烈意识。至少,添加到各种列表是很普遍的,通常以第二次执行时不会抑制重复条目的方式进行。
Dale Hagglund

1
另一个想法:使用我上面建议的方法,您的emacs状态可能不是您的.emacs实际执行的状态。即,由于您还没有从干净的状态执行整个.emacs文件,因此您实际上并不知道该文件可以满足您的要求。
Dale Hagglund '04

1
话虽这么说,难道无法以幂等的方式编写.emacs吗?全球状态不佳。
Ehtesh Choudhury

39

如果您在当前活动的缓冲区中打开了.emacs文件,请执行以下操作:

MX评估缓冲区

12
这里要注意的一件事是,这样做可能不会使您处于与重新启动方法相同的状态。(人为的示例:如果您的.emacs中有“切换”影响)。
luapyad 2010年



13

M-: (load user-init-file)


笔记

  • 您在Eval:提示符下输入它(包括括号)
  • user-init-file~/.emacs默认情况下包含值(指向配置文件路径)的变量
  • (load)是的较短,较旧且非交互式的版本(load-file);它不是emacs命令(要输入M-x),而仅仅是elisp函数

结论

M-: > M-x


是M-:> Ctrl Alt x?根据您的逻辑,我想像M-:<CMx,当init文件中只有一行被更改时?也许只是==
罗伯特·霍顿

12

其他人已经按照您的说明回答了您的问题,但是我发现我通常想执行我刚刚编写的行。为此,CtrlAltx在Lisp中工作正常。


3
另请参见eval-lastsexp,在C-x C-e
Derek Slager,2010年

使用C-M-x,您不必处于“崩溃的尽头”-您是否在考虑C-x C-e?有趣的C-M-x是,即使point在函数/变量声明的中间,您也可以调用它。
托马斯

当我只使用Cx Ce时,我可能养成了渐行渐远的习惯。感谢您的接见!
巴哈巴(Bahbar)2015年

9

我建议您一开始不要这样做。相反,请启动一个新的emacs会话并测试您所做的任何更改以查看它们是否正常运行。这样做的原因是避免使您处于无法运行的.emacs文件状态,该文件无法加载或无法干净加载。如果您在原始会话中进行了所有编辑,而在新会话中进行了所有测试,则始终可以得到可靠的注释掉有害代码的工具。

当您最后对更改感到满意时,请继续使用其他答案之一重新加载。我个人的喜好是eval仅添加/更改的部分,然后仅突出显示添加/更改的代码和call的区域M-x eval-region。如luapyad所指出的那样,这样做可以最大程度地减少所评估的代码,从而最大程度地减少任何意外的副作用。


9

键盘快捷键:

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

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

辉煌!这是非常好的!
PinkCollins

7
C-x C-e ;; current line
M-x eval-region ;; region
M-x eval-buffer ;; whole buffer
M-x load-file ~/.emacs.d/init.el

4

我目前正在使用Ubuntu 15.04;我喜欢为此定义一个密钥。
[M-插入]转换为键盘上的alt-插入。
将其放在您的.emacs文件中:

(global-set-key [M-insert] '(lambda() (interactive) (load-file "~/.emacs")))

3

在您的初始化文件中定义它,并通过Mx reload-user-init-file调用

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

2

尽管M-x eval-buffer可以,但是您可能会遇到拨动开关和其他类似问题。更好的方法可能是“标记”或突出显示.emacs中的新内容(如果只是弄乱,甚至会刮擦缓冲区),然后M-x eval-region。希望这可以帮助。


2

这是一种快速简便的方法来快速测试您的配置。您还可以C-x C-e在特定的Lisp末尾使用来单独执行某些功能。

Cx Ce运行命令eval-last-sexp(在global-map中找到),它是一个交互式的已编译Lisp函数。

它绑定到Cx Ce。

(eval-last-exp EVAL-LAST-SEXP-ARG-INTERNAL)

先评估性爱;回显区域中的打印值。使用prefix参数交互地将输出打印到当前缓冲区中。

通常,此函数根据变量'eval-expression-print-length'和'eval-expression-print-level'的值截断长输出。但是,如果前缀参数为零,则不存在这种截断。这样的前缀参数还会使整数以几种其他格式(八进制,十六进制和字符)打印。

如果“ eval-expression-debug-on-error”为非零(默认值),则此命令安排所有错误进入调试器。



0

您可以像这样为emacs设置键绑定

;; reload emacs configuration
(defun reload-init-file ()
  (interactive)
  (load-file "~/.emacs"))

(global-set-key (kbd "C-c r") 'reload-init-file) 

希望这会有所帮助!


-2

如果您碰巧在Emacs中打开了外壳,您还可以执行以下操作:

. ~/.emacs

可以节省一些按键。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.