emacs - 如何使 .emacs 文件具有幂等性?

标签 emacs elisp emacs24 dot-emacs idempotent

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

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

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

动机

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

具体步骤

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

例如,

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

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

    最佳答案

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

  • add-hook 使用命名函数, 和键绑定(bind)而不是匿名函数。对于 add-hook特别是,这允许它换出现有的引用。
  • 小心使用defvar ,默认情况下,仅当变量未定义时才评估主体。 C-M-xdefvar将重新评估正文,但 eval-buffer如果变量已经初始化,则不会。
  • 小心使用(quote function)而不是 function引用命名函数而不是函数的值。见 Anonymous Functions对此进行更深入的讨论。
  • 请记住 require只会在第一次执行时加载相应的库,它不会在重复调用时重新评估 load做。 Autoload 也使用 require 来加载相应的库。
  • 首选 add-to-list而不是 cons仅在元素不存在时添加元素。
  • 对于旧模式激活,请务必使用 (mode-name-mode t)激活而不是切换功能。 turn-on- 也是如此次要模式功能,而不是模式切换。
  • 如果重复执行会产生副作用的保护 block 。特别是对于服务器模式,(unless (server-running-p) (server-start)) ,以及用于安装软件包的类似保护措施。
  • 小心 eval-after-load 中的副作用或自定义模式 Hook 。请记住,默认模式 Hook 在第一次启用模式时运行,并且在每个后续缓冲区上运行,但在修改 Hook 功能时不会在现有缓冲区中重新运行。 eval-after-load不太可能出错,记住它的评估时间仍然很重要。
  • 与#2相关,makunbound如果需要重新评估相互依赖的变量链可能会很有用,因为它将强制 defvar始终在评估文件时执行。

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

    关于emacs - 如何使 .emacs 文件具有幂等性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25099061/

    相关文章:

    emacs - 使 emacs cedet 语义查找包含目录

    c - 在 emacs 中将 openmp 指令缩进为 C/C++ 代码

    bash - 更改 ls 命令的 emacs bash 颜色

    emacs - 如何在 Emacs 中打开/关闭特定模式?

    emacs - 打开 dired 并选择与前一个缓冲区关联的文件?

    c++ - 如何将 Emacs 24 配置为 K&R(或 Stroutrup)风格?

    Emacs:在 ansi-term 中具有完全不同的背景颜色

    c++ - 尝试使用 CEDET/EDE 设置 C++ 项目

    emacs - 我怎么能在输入内容时使用像 isearch-forward 这样的查询替换

    emacs - 将执行属性添加到 elisp 中的文件