11

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 声明性依赖管理解决方案?

4

2 回答 2

9

我在这里回答自己,因为最终我选择了替代解决方案。

phils 的回答仍然有效,但我发现将 .emacs.d 目录置于版本控制之下很麻烦,而且公平地说,我不想打扰假子模块。

我做了什么:我联系了 el-get 的维护者 Dimitri,并向他提出了这个问题。

迪米特里 说:

我可以看到我们添加了一个 el-get-cleanup 函数,您必须使用当前的软件包列表调用该函数,该函数将 el-get-remove 任何已在本地安装但不在提供的列表中的软件包。

(el-get-cleanup my-packages)

然后,您可以根据需要从用户初始化文件中使用它,或者不时将其作为例程执行。

在他的指导下,我编写了有问题的函数。

(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)))

啊,开源的乐趣……

(另见我的博

于 2012-09-28T01:19:23.783 回答
4

您应该将 el-get 与某种形式的版本控制结合使用。这提供了可移植性,因此当您删除一个包并将结果提交到您的存储库时,一旦其他实例提取了这些更改,该包也将被卸载。

如果您将包文件留给 el-get 进行管理,那么在从一个实例中删除包后,这些文件可能仍存在于其他副本上,但是,如果 el-get 的状态和自动加载文件在您的存储库中,我认为每个包的状态应该是正确的。

就个人而言,我建议在安装软件包后将所有文件提交到您的存储库。这样,当您删除一个包、提交更改并从另一个实例中提取这些更改时,两个副本都处于相同的状态。

此外,在设置我的 Emacs 配置的新实例时,我永远不会相信远程源的可用性、一致性或持久性——克隆我的存储库的行为是获得工作系统所需要的全部。

所以:使用 el-get 安装和更新软件包,并使用版本控制使其可移植。

于 2012-09-24T10:58:28.940 回答