无论我重新加载多少次.emacs
文件,
M-x 加载文件 RET ~/.emacs RET
我希望结果与第一次相同。我想做我的.emacs
文件为 idempotent .
动机
我知道我可以通过手术评估一个区域 (C-c C-r)、一个 defun (C-M-x) 或最后一个 sexp (C-x C-e)。在进行小的更改时,我经常采用这种更精致的方法。但是,当重新处理 .emacs
文件,我有时想通过重新加载整个 .emacs
来最终检查更改的结果。文件。每次重新启动 emacs 都会很快变老,尤其是在做主要的 .emacs
时家政。
具体步骤
我必须采取哪些具体步骤来更新我的 .emacs
用幂等操作替换非幂等操作的文件?
例如,
add-hook
, 哪一个如果已经存在,则不会将函数重新添加到钩子(Hook)中。
一个全面的检查和更正列表将是理想的,但您遇到的任何关键的个人检查也会有所帮助。
最佳答案
我不知道是否可以完全确保这一点,因为大多数 .emacs 文件依赖于可能没有幂等初始化例程的库。但是,有一些有用的技巧可以减少问题:
add-hook
使用命名函数, 和键绑定(bind)而不是匿名函数。对于 add-hook
特别是,这允许它换出现有的引用。 defvar
,默认情况下,仅当变量未定义时才评估主体。 C-M-x
在 defvar
将重新评估正文,但 eval-buffer
如果变量已经初始化,则不会。 (quote function)
而不是 function
引用命名函数而不是函数的值。见 Anonymous Functions对此进行更深入的讨论。 require
只会在第一次执行时加载相应的库,它不会在重复调用时重新评估 load
做。 Autoload 也使用 require 来加载相应的库。 add-to-list
而不是 cons
仅在元素不存在时添加元素。 (mode-name-mode t)
激活而不是切换功能。 turn-on-
也是如此次要模式功能,而不是模式切换。 (unless (server-running-p) (server-start))
,以及用于安装软件包的类似保护措施。 eval-after-load
中的副作用或自定义模式 Hook 。请记住,默认模式 Hook 在第一次启用模式时运行,并且在每个后续缓冲区上运行,但在修改 Hook 功能时不会在现有缓冲区中重新运行。 eval-after-load
不太可能出错,记住它的评估时间仍然很重要。 makunbound
如果需要重新评估相互依赖的变量链可能会很有用,因为它将强制 defvar
始终在评估文件时执行。 运行
eval-buffer
init 文件应该尽可能地具有幂等性,但重要的是要记住 emacs lisp 喜欢副作用和状态。虽然可以在一定程度上改善这一点,但重新评估 init 永远不会将 emacs 恢复到它首次启动时的状态。
关于emacs - 如何使 .emacs 文件具有幂等性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25099061/