【问题标题】:How can a .emacs file be made idempotent?如何使 .emacs 文件具有幂等性?
【发布时间】:2014-08-02 20:21:37
【问题描述】:

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

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

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

动机

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

具体步骤

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

例如,

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

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

【问题讨论】:

  • 在 elisp 中完全幂等是不可能的。除非您跟踪每个定义并知道要取消绑定的内容。特别是如果您使用大量第三方软件包。您的清单走在正确的道路上,但理想情况下,您需要在重新评估之前卸载所有包。我发现开发我的 .emacs 的方法是以重新启动 emacs 不痛苦的方式编写它,如果您的启动时间很短,那么在一个 emacs 实例中进行开发并重新启动很多次以测试您的在另一个实例中初始化并不是什么大问题。
  • 你可以做的是做一个 -Q 启动并将所有内容存储在一个文件中的 main obarry 中,然后编写一个函数来解除除 -Q obarray 中的所有内容之外的所有内容并恢复所有正常您商店的价值。

标签: emacs elisp emacs24 dot-emacs idempotent


【解决方案1】:

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

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

  2. 谨慎使用defvar,默认情况下,仅当变量未定义时才评估正文。 defvar 上的 C-M-x 将重新评估主体,但如果变量已初始化,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 始终在评估文件时执行.

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

【讨论】:

    【解决方案2】:

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

    • defun.
    • 将q 设置为常数。
    • 使用常量添加到列表。
    • 添加挂钩,但最好添加符号而不是 lambda 表达式。
    • 启用/禁用次要模式。
    • 在条件中包含上述部分内容。

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 2011-02-05
        • 2023-03-26
        • 1970-01-01
        • 2020-05-08
        • 2018-03-05
        • 1970-01-01
        • 1970-01-01
        • 2021-11-11
        • 2014-02-12
        相关资源
        最近更新 更多