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

时间:2012-09-23 13:49:36

标签: 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)                                                

el-get将确保软件包自动安装并正确初始化。但是,我的理解是,当您取消引用包时,它不会被卸载。如果您手动卸载它,则必须在所有计算机上手动卸载它。换句话说,el-get只能实现真正便携式解决方案的一半。我的问题是,是否有人编写了elisp代码,只是通过在init.el中取消引用它们来卸载软件包?或者我是否应该寻找其他地方的emacs完全可移植的声明性依赖管理解决方案?

2 个答案:

答案 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安装和更新软件包,并使用版本控制使其可移植。