无论我重新加载.emacs
个文件多少次,
M-x加载文件RET 〜/ .emacs RET
我希望结果与第一次相同。我想将.emacs
文件设为idempotent。
我知道我可以手术评估一个区域( Cc Cr ),一个defun( CMx ),或者最后一个性别( Cx Ce )。在做出微小改动时,我经常采取这种更精细的方法。但是,在重新处理.emacs
文件时,我有时希望通过重新加载整个.emacs
文件来最终检查更改结果。每次重新启动emacs都会很快,尤其是在进行重要.emacs
内务管理时。
我必须采取哪些具体步骤来更新我的.emacs
文件,以用幂等的操作替换非幂等操作?
例如,
add-hook
的调用替换对挂钩的直接添加
如果已经存在,则不会向钩子重新添加函数。全面的检查和更正列表是理想的,但对您而言发生的任何关键的个人检查也会有所帮助。
答案 0 :(得分:9)
我不知道可以完全确保这一点,因为大多数.emacs文件依赖于可能没有幂等初始化例程的库。但是,有一些有用的技巧可以减少问题:
使用add-hook
的命名函数和键绑定而不是匿名函数。特别是对于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
或自定义模式挂钩中的副作用。请记住,默认模式挂钩在首次启用模式时运行,并在每个后续缓冲区上运行,但在修改挂钩函数时不会在现有缓冲区中重新运行。 eval-after-load
不太可能将事情绊倒,记住它的评估时仍然很重要。
与#2相关,如果需要重新评估彼此依赖的变量链,makunbound
可能会有用,因为它会强制defvar
始终执行评估文件。
在init文件上运行eval-buffer
应该尽可能的幂等,但重要的是要记住emacs lisp喜欢副作用和状态。尽管可以在某种程度上改善这一点,但重新评估init将永远不会将emacs返回到它首次启动时的状态。
答案 1 :(得分:4)
将自己限制在你认为是幂等的事物上:
当然幂等实际上并不意味着结果与重新启动相同(例如删除setq
然后重新评估您的.emacs赢了&#39 ; t删除前一个setq的效果),但上面几乎是我尝试在我自己的〜/ .emacs中遵循的原则。
答案 2 :(得分:2)
除了其他人所说的内容之外,加载(例如require
)库,包括第三方库,其加载是幂等的。
是的,要找到给定库的内容,您可能需要阅读代码或实验。但是现在图书馆应该是幂等的(或接近它),而且很多都是。