4

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

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

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

动机

我知道我可以通过手术评估一个区域 ( C-c C-r)、一个defun ( )C-M-x或最后一个 sexp ( C-x C-e)。在进行小的更改时,我经常采用这种更精致的方法。但是,在重新处理文件时,有时我想通过重新加载整个文件.emacs来最终检查更改的结果。.emacs每次重新启动 emacs 都会很快变老,尤其是在进行主要的.emacs内务处理时。

具体步骤

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

例如,

  1. 搜索“-hook”并将直接添加到钩子的调用替换为调用add-hook,如果已经存在,则不会将函数重新添加到钩子中。
  2. 用直接设置或清除替换任何标志的切换。当心??尤其是。
  3. ...

一个全面的检查和更正列表将是理想的,但您遇到的任何关键的个人检查也会有所帮助。

4

3 回答 3

9

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

  1. 对 , 和键绑定使用命名函数add-hook而不是匿名函数。特别是,这add-hook允许它交换现有的引用。

  2. 谨慎使用defvar,默认情况下,仅当变量未定义时才评估主体。C-M-xon adefvar将重新评估主体,但eval-buffer如果变量已经初始化则不会。

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

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

  5. 与其add-to-listcons在元素不存在的情况下添加元素,不如选择它。

  6. 对于旧模式激活,请确保使用(mode-name-mode t)激活而不是切换功能。同样对于turn-on-次要模式功能而不是模式切换。

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

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

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

在 init 文件上运行eval-buffer应该尽可能地幂等,但重要的是要记住 emacs lisp 喜欢副作用和状态。虽然可以在一定程度上改善这一点,但重新评估 init 永远不会将 emacs 恢复到它首次启动时的状态。

于 2014-08-02T23:06:47.930 回答
4

把自己限制在你知道是幂等的事情上:

  • 德芬。
  • 将q设置为常数。
  • 带有常量的添加到列表。
  • add-hook,但最好添加一个符号而不是 lambda 表达式。
  • 启用/禁用次要模式。
  • 在条件中包含上述一些内容。

当然幂等实际上并不意味着结果与重新启动相同(例如删除 asetq然后重新评估您的 .emacs 不会删除之前 setq 的效果),但以上几乎是原则我尝试遵循自己的 ~/.emacs。

于 2014-08-02T22:27:44.973 回答
2

除了其他人所说的,加载(例如require)库,包括第三方库,其加载是幂等的。

是的,要找出给定库的内容,您可能需要阅读代码或进行实验。但是现在图书馆应该是幂等的(或接近它),而且很多都是。

于 2014-08-03T02:12:58.773 回答