el-get
在帮助实现便携式emacs配置设置方面做了大量工作.我们的想法是在emacs配置文件中声明您想要的软件包,将该文件推送到repo,然后将其拉到您想要相同emacs配置的所有计算机上.这是代码的外观elisp
:
(setq my-packages (append '(el-get switch-window yasnippet ...)
(mapcar 'el-get-source-name el-get-sources)))
(el-get 'sync my-packages)
Run Code Online (Sandbox Code Playgroud)
el-get
将确保软件包自动安装并正确初始化.但是,我的理解是,当您取消引用包时,它不会被卸载.如果您手动卸载它,则必须在所有计算机上手动卸载它.换句话说,el-get只能实现真正便携式解决方案的一半.我的问题是,是否有人编写了elisp代码,只是通过在init.el中取消引用它们来卸载软件包?或者我是否应该寻找其他地方为emacs提供完全可移植的声明性依赖管理解决方案?
我在这里回答自己,因为最后我选择了另一种解决方案.
phils的回答仍然有效,但是我发现在版本控制下有.emacs.d目录很麻烦,而且公平地说我不想打扰假子模块.
我做了什么:我联系了el-get的维护者Dimitri,并向他提出了问题.
迪米特里说:
我可以看到我们添加了一个el-get-cleanup函数,您必须使用当前的软件包列表调用它,并且可以删除已在本地安装但未在提供的列表上安装的任何软件包.
(el-get-cleanup my-packages)
Run Code Online (Sandbox Code Playgroud)
然后,您可以根据需要使用user-init-file中的文件,或者不时地将其用作例程.
在他的指导下,我写了有问题的函数.
(defun el-get-cleanup (packages)
"Remove packages not explicitly declared"
(let* ((packages-to-keep (el-get-dependencies (mapcar 'el-get-as-symbol packages)))
(packages-to-remove (set-difference (mapcar 'el-get-as-symbol
(el-get-list-package-names-with-status
"installed")) packages-to-keep)))
(mapc 'el-get-remove packages-to-remove)))
Run Code Online (Sandbox Code Playgroud)
啊,开源的乐趣......
(参见我的博客帖子)
您应该将 el-get 与某种形式的版本控制结合使用。这提供了可移植性,因此当您删除包并将结果提交到存储库时,一旦其他实例拉取了这些更改,该包也将被卸载。
如果您将软件包文件留给 el-get 来管理,那么从一个实例中删除软件包后,这些文件可能仍然存在于其他副本上,但是,如果 el-get 的状态和自动加载文件位于您的存储库中,我认为每个包的状态应该是正确的。
就个人而言,我建议在安装软件包后将所有文件提交到存储库。这样,当您删除包、提交更改并从另一个实例中提取这些更改时,两个副本都处于相同的状态。
此外,在设置我的 Emacs 配置的新实例时,我永远不会相信远程源的可用性、一致性或持久性——克隆我的存储库的行为就是获取工作系统所需的全部操作。
所以:使用 el-get 来安装和更新软件包,并使用版本控制使其可移植。
归档时间: |
|
查看次数: |
1195 次 |
最近记录: |