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)
el-get
将确保软件包自动安装并正确初始化。但是,我的理解是,当您取消引用包时,它不会被卸载。如果您手动卸载它,则必须在所有计算机上手动卸载它。换句话说,el-get只能实现真正便携式解决方案的一半。我的问题是,是否有人编写了elisp代码,只是通过在init.el中取消引用它们来卸载软件包?或者我是否应该寻找其他地方的emacs完全可移植的声明性依赖管理解决方案?
答案 0 :(得分:8)
我在这里回答自己,因为最后我选择了替代解决方案。
菲尔斯的答案仍然有效,但我发现将.emacs.d目录置于版本控制之下很麻烦,而且公平地说我不想打扰假子模块。
我做了什么:我联系了el-get的维护者Dimitri,并向他提出了问题。
迪米特里说:我可以看到我们添加了一个el-get-cleanup函数,您必须使用当前的软件包列表进行调用,这样才能删除已在本地安装但未在提供的列表中安装的任何软件包。
(el-get-cleanup my-packages)
如果您愿意,可以使用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)))
啊,开源的乐趣......
(另请参阅我的博客post)
答案 1 :(得分:3)
您应该将el-get与某种形式的版本控制结合使用。这提供了可移植性,因此当您删除包并将结果提交到您的存储库时,一旦他们撤消了这些更改,也将为其他实例卸载该包。
如果您要将软件包文件保留给el-get进行管理,那么在从一个实例中删除软件包后,其他副本上仍可能存在这些文件,但前提是el-get的状态和自动加载文件在您的仓库中,我认为每个包的州应该是正确的。
就个人而言,我建议在安装软件包后将所有文件提交到您的存储库。这样,当您删除包,提交更改,并从另一个实例中提取这些更改时,两个副本都处于相同的状态。
此外,在设置我的Emacs配置的新实例时,我永远不会相信远程源的可用性,一致性或持久性 - 克隆我的存储库的行为是获取工作系统。
所以:使用el-get安装和更新软件包,并使用版本控制使其可移植。