如何使.emacs文件成为幂等的?

kjh*_*hes 4 emacs elisp dot-emacs idempotent emacs24

无论我重新加载.emacs文件多少次,

M-x load-file RET ~/.emacs RET

我希望结果与第一次相同.我想让我的.emacs文件是幂等的.

动机

我知道我可以手术评估一个region(C-c C-r),C-M-xdefun(C-x C-e)或最后一个sexp().在做出微小改动时,我经常采取这种更精细的方法.但是,在重新处理.emacs文件时,我有时希望通过重新加载整个.emacs文件来最终检查更改结果.每次重新启动emacs都会很快变老,特别是在做大.emacs家务时.

具体步骤

我必须采取哪些具体步骤来更新我的.emacs文件以用幂等的操作替换非幂等操作?

例如,

  1. 搜索"-hook"并用调用替换钩子的直接添加,add-hook如果已经存在,则不会向钩子重新添加函数.
  2. 用直接设置或清除替换任何标志的切换.小心?? 特别是.
  3. ...

一个全面的检查和更正列表将是理想的,但任何发生在您身上的关键个人检查也会有所帮助.

dgt*_*zed 9

我不知道因为可以完全确保这一点,因为大多数.emacs文件依赖于可能没有幂等初始化例程的库.但是,有一些有用的技巧可以减少问题:

  1. 使用命名函数add-hook和键绑定而不是匿名函数.对于add-hook特别,这使得它能够换出的现有基准.

  2. 小心使用defvar,默认情况下,仅在未定义变量时才评估正文.将C-M-xa defvar重新评估正文,但eval-buffer如果变量已经初始化则不会.

  3. 小心使用(quote function)而不是function引用命名函数而不是函数的值.有关此内容的更多高级讨论,请参阅匿名函数.

  4. 请记住,require只会在第一次执行时加载相应的库,它不会像重复调用那样重新进行重新评估load.Autoload还使用require来加载相应的库.

  5. 如果元素不存在,则首选add-to-list而不是cons仅添加元素.

  6. 对于较旧的模式激活,请务必使用(mode-name-mode t)激活而不是切换功能.同样,对于turn-on-次模式功能而不是模式切换.

  7. 如果重复执行会产生副作用的防护块.特别是对于服务器模式,(unless (server-running-p) (server-start))以及用于安装包的类似保护.

  8. 注意副作用eval-after-load或自定义模式钩子.请记住,默认模式挂钩在首次启用模式时运行,并在每个后续缓冲区上运行,但在修改挂钩函数时不会在现有缓冲区中重新运行.eval-after-load不太可能将事情绊倒,记住评估的时间仍然很重要.

  9. 与#2相关,makunbound如果需要重新评估彼此依赖的变量链,则可能会有用,因为它将强制defvar始终在评估文件时执行.

eval-buffer在init文件上运行应该尽可能地是幂等的,但重要的是要记住emacs lisp喜欢副作用和状态.尽管可以在某种程度上改善这种情况,但重新评估init将永远不会将emacs返回到它首次启动时的状态.