el-get in a便携式emacs配置解决方案

Dan*_*icz 10 emacs

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提供完全可移植的声明性依赖管理解决方案?

Dan*_*icz 8

我在这里回答自己,因为最后我选择了另一种解决方案.

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)

啊,开源的乐趣......

(参见我的博客帖子)


phi*_*ils 4

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

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

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

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

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