如何使.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
文件,以将非幂等运算替换为幂等运算
比如说,
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))
,以及用于安装软件包的类似保护makunbund
在需要重新评估相互依赖的变量链时可能很有用,因为它将强制defvar
始终在评估文件时执行在init文件上运行
eval buffer
应该尽可能是幂等的,但重要的是要记住,emacs lisp喜欢副作用和状态。虽然可以在某种程度上改善这一点,但重新评估init将永远不会将emacs返回到它最初启动时的状态。除了其他人所说的,加载(例如,需要
)库,包括加载为幂等的第三方库
是的,对于给定的库,您可能需要阅读代码或进行实验。但是现在的库被认为是幂等的(或接近幂等的),而且很多都是。在elisp中完全幂等是不可能的。除非你跟踪每一个定义,知道要解开什么。特别是如果你使用了很多第三方软件包。您的列表在正确的路径上,但理想情况下,您需要在重新评估之前卸载所有包。我发现很好地开发我的.emacs的方法是,如果你的启动时间很短,那么重新启动emacs并不痛苦,然后在emacs的一个实例中进行开发,并在另一个实例中多次重新启动以测试您的init并不是什么大麻烦。您可以做的是启动a-Q并将所有内容存储在主数据库中的一个文件中,然后编写一个函数,该函数将解除绑定除-Q obarray中的内容之外的所有内容,并从存储中恢复所有正常值。