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

如何使.emacs文件成为幂等文件?,emacs,elisp,emacs24,dot-emacs,idempotent,Emacs,Elisp,Emacs24,Dot Emacs,Idempotent,无论我重新加载.emacs文件多少次 M-x加载文件RET~/.emacs RET 我希望结果和第一次一样。我想将我的.emacs文件 动机 我知道我可以通过手术评估一个区域(C-C-r)、一个defun(C-M-x)或最后一个sexp(C-XC-e)。在做一些小的改变时,我通常会采取这样一种更精细的方法。但是,在重新处理.emacs文件时,有时我希望通过重新加载整个.emacs文件来最终检查更改结果。每次重新启动emacs都会很快变老,尤其是在执行主.emacs内务管理时 具体步骤 我必须采取

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

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

我希望结果和第一次一样。我想将我的
.emacs
文件

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

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

比如说,

  • 搜索“-hook”,并用调用
    addhook
    ,替换直接添加到hook的内容 如果钩子已经存在,则不会将函数重新添加到钩子中
  • 用直接设置或清除替换任何标志的切换。尤其要小心

  • 一个全面的检查和正确的列表是理想的,但是任何关键的单独检查都会对您有所帮助。

    将您自己限制在您知道的幂等项:

    • 德芬
    • 将q设置为常数
    • 使用常量添加到列表中
    • 添加钩子,但最好添加符号而不是lambda表达式
    • 启用/禁用次要模式
    • 将上述部分包装在适当的条件下

    当然,幂等并不意味着结果与重新开始的结果相同(例如,删除一个
    setq
    ,然后重新评估你的.emacs不会删除前一个setq的影响),但以上是我在自己的~/.emacs中尝试遵循的基本原则。

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

  • 添加钩子
    和键绑定使用命名函数,而不是匿名函数。特别是对于
    addhook
    ,这允许它交换现有的引用

  • 小心使用
    defvar
    ,默认情况下,只有在变量未定义时,才会计算主体<
    defvar
    上的code>C-M-x
    将重新评估主体,但如果变量已初始化,则
    eval buffer
    将不会重新评估主体

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

  • 请记住,
    require
    只会在第一次执行相应的库时加载,而不会像
    load
    那样在重复调用时重新求值。自动加载还使用require加载相应的库

  • 宁愿
    addtolist
    而不是
    cons
    只添加不存在的元素

  • 对于较旧的模式激活,请确保使用
    (模式名称mode t)
    来激活,而不是使用切换功能。同样,对于
    打开-
    次要模式功能,而不是模式切换

  • 如果反复执行,保护块确实会产生副作用。特别是对于服务器模式,
    (除非(server-running-p)(server start))
    ,以及用于安装软件包的类似保护

  • 在加载后评估或自定义模式挂钩中,小心副作用。请记住,默认模式钩子在第一次启用模式时以及在每个后续缓冲区上运行,但在修改钩子函数时不会在现有缓冲区中重新运行<代码>加载后评估不太可能出现问题,记住评估时间仍然很重要

  • 与#2相关的是,
    makunbund
    在需要重新评估相互依赖的变量链时可能很有用,因为它将强制
    defvar
    始终在评估文件时执行


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

    除了其他人所说的,加载(例如,
    需要
    )库,包括加载为幂等的第三方库


    是的,对于给定的库,您可能需要阅读代码或进行实验。但是现在的库被认为是幂等的(或接近幂等的),而且很多都是。

    在elisp中完全幂等是不可能的。除非你跟踪每一个定义,知道要解开什么。特别是如果你使用了很多第三方软件包。您的列表在正确的路径上,但理想情况下,您需要在重新评估之前卸载所有包。我发现很好地开发我的.emacs的方法是,如果你的启动时间很短,那么重新启动emacs并不痛苦,然后在emacs的一个实例中进行开发,并在另一个实例中多次重新启动以测试您的init并不是什么大麻烦。您可以做的是启动a-Q并将所有内容存储在主数据库中的一个文件中,然后编写一个函数,该函数将解除绑定除-Q obarray中的内容之外的所有内容,并从存储中恢复所有正常值。