如何在不重新启动 Emacs 的情况下让 Emacs 重新加载我在 .emacs
中更新的所有定义?
您可以使用命令加载文件(Mx load-file
,然后按两次回车以接受默认文件名,即当前正在编辑的文件)。
您也可以将点移动到任何 sexp 的末尾,然后按 C-xC-e 来执行该 sexp。如果您只是更改一两行,通常不需要重新加载整个文件。
很奇怪 很方便
Mx eval-buffer
这里不提。
如果您的 .emacs
是幂等的,它会立即评估缓冲区中的所有代码,这是最快的方法。
.emacs
是(或必须是)幂等的?
.emacs
不是幂等的?
您通常可以重新评估更改的区域。标记您已更改的 ~/.emacs 区域,然后使用 M-x eval-region RET
。这通常比重新评估整个文件更安全,因为很容易编写一个 .emacs 文件,该文件在加载两次后就不能正常工作。
如果您在当前活动的缓冲区中打开了 .emacs 文件:
M-x eval-buffer
M-x load-file
~/.emacs
解决方案
M-: (load user-init-file)
笔记
你在 Eval: 提示符中输入它(包括括号)
user-init-file 是一个默认保存 ~/.emacs 值(指向配置文件路径)的变量
(load) 是 (load-file) 的更短、更旧和非交互式版本;它不是一个 emacs 命令(在 Mx 中输入),而只是一个 elisp 函数
结论
M-:
> M-x
如前所述,其他人已经回答了您的问题,但我发现我通常想要执行我刚刚写的行。为此,lisp 中的 CtrlAltx 工作得很好。
eval-lastsexp
,位于 C-x C-e
C-M-x
,您不必“处于 lisp 的末尾”——您可能在考虑 C-x C-e
吗? C-M-x
的好处在于,即使 point 位于函数/变量声明的中间,您也可以调用它。
以下应该这样做...
M-x load-file
我建议你一开始不要这样做。相反,启动一个新的 emacs 会话并测试您所做的任何更改以查看它们是否正常工作。这样做的原因是为了避免让您处于无法运行的 .emacs 文件的状态,该文件无法加载或无法干净地加载。如果您在原始会话中进行所有编辑,并在新会话中进行所有测试,那么您将始终拥有可靠的东西来注释掉有问题的代码。
当您最终对更改感到满意时,请继续使用其他答案之一重新加载。我个人的偏好是eval
只是您添加/更改的部分,并且只需突出显示添加/更改代码的区域并调用 M-x eval-region
。正如 luapyad 指出的那样,这样做可以最大限度地减少评估的代码,最大限度地减少任何无意的副作用。
键盘快捷键:
(defun reload-init-file ()
(interactive)
(load-file user-init-file))
(global-set-key (kbd "C-c C-l") 'reload-init-file) ; Reload .emacs file
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
在你的初始化文件中定义它并通过 Mx reload-user-init-file 调用
(defun reload-user-init-file()
(interactive)
(load-file user-init-file))
~/.config/emacs/
而不是 ~/.emacs.d/
中,它也可以工作
我目前使用的是 Ubuntu 15.04;我喜欢为此定义一个键。 [M-insert] 在我的键盘上转换为 alt-insert。把它放在你的 .emacs 文件中:
(global-set-key [M-insert] '(lambda() (interactive) (load-file "~/.emacs")))
除了 Mx eval-buffer 或 Mx load-file 之类的命令,您还可以从命令行重新启动新的 emacs:
emacs -q --load "init.el"
用法示例 stackoverflow.com/questions/44959535/company-backends-in-gnu-emacs/
虽然 M-x eval-buffer
会起作用,但您可能会遇到切换和其他类似问题的问题。更好的方法可能是“标记”或突出显示 .emacs 中的新内容(如果您只是在搞乱,甚至是暂存缓冲区),然后是 M-x eval-region
。希望这可以帮助。
这是快速测试配置的快速简便的方法。您还可以在特定 lisp 的末尾使用 C-x C-e
来单独执行某些功能。
Cx Ce 运行命令 eval-last-sexp(在 global-map 中找到),这是一个交互式编译的 Lisp 函数。它与 Cx Ce 绑定。 (eval-last-sexp EVAL-LAST-SEXP-ARG-INTERNAL) 在点之前评估 sexp;在回声区打印值。交互式地,使用前缀参数,将输出打印到当前缓冲区。通常,此函数根据变量“eval-expression-print-length”和“eval-expression-print-level”的值截断长输出。但是,如果前缀参数为零,则不存在这样的截断。这样的前缀参数还会导致整数以几种其他格式(八进制、十六进制和字符)打印。如果 'eval-expression-debug-on-error' 为非 nil(默认值),则此命令安排所有错误进入调试器。
您可以像这样为 emacs 设置键绑定
;; reload emacs configuration
(defun reload-init-file ()
(interactive)
(load-file "~/.emacs"))
(global-set-key (kbd "C-c r") 'reload-init-file)
希望这会有所帮助!
如果你碰巧在 Emacs 中打开了一个 shell,你也可以这样做:
. ~/.emacs
可以节省几个按键。
defun
或defvar
之后,您还可以将其留在声明正文中并键入C-M-x
。非常便利。M-x load-file
然后用~/.emacs
代替默认值呢?