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

时间:2014-08-02 20:21:38

标签: emacs elisp emacs24 dot-emacs idempotent

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

M-x加载文件RET 〜/ .emacs RET

我希望结果与第一次相同。我想将.emacs文件设为idempotent

动机

我知道我可以手术评估一个区域( Cc Cr ),一个defun( CMx ),或者最后一个性别( Cx Ce )。在做出微小改动时,我经常采取这种更精细的方法。但是,在重新处理.emacs文件时,我有时希望通过重新加载整个.emacs文件来最终检查更改结果。每次重新启动emacs都会很快,尤其是在进行重要.emacs内务管理时。

具体步骤

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

例如,

  1. 搜索“-hook”并使用对add-hook的调用替换对挂钩的直接添加 如果已经存在,则不会向钩子重新添加函数。
  2. 使用直接设置或清除替换任何标记的切换。特别要注意 ??
  3. ...
  4. 全面的检查和更正列表是理想的,但对您而言发生的任何关键的个人检查也会有所帮助。

3 个答案:

答案 0 :(得分:9)

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

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

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

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

  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始终执行评估文件。

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

答案 1 :(得分:4)

将自己限制在你认为是幂等的事物上:

  • defun定义。
  • setq为常数。
  • 使用常量添加到列表。
  • add-hook,但最好是添加符号而不是lambda表达式。
  • 启用/禁用次要模式。
  • 在条件中包装上述部分内容。

当然幂等实际上并不意味着结果与重新启动相同(例如删除setq然后重新评估您的.emacs赢了&#39 ; t删除前一个setq的效果),但上面几乎是我尝试在我自己的〜/ .emacs中遵循的原则。

答案 2 :(得分:2)

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

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