如何保存Emacs 24中所有已安装软件包的列表?

54
我正在使用Prelude作为基本的Emacs配置。我已经从包管理器中安装了许多软件包,我想在另一台机器上使用我的设置。
我不想携带已安装的软件包,也不想手动创建列表。
有什么方法可以将所有已安装的软件包列表保存到prelude-package.el或任何其他文件中,以便当我将此配置带到另一台机器时,在首次使用时它们会自动安装?
4个回答

74
您可以从变量package-activated-list获取当前安装的软件包列表(不包括内置软件包)。要在启动时自动安装它们,请参见此问题:如何通过指定软件包名称列表自动安装emacs软件包? 更具体地说,如果执行C-h v package-activated-list,复制显示的值,并将其插入为prelude-packages的值,则Emacs会在启动时自动确保安装这些软件包。

1
值得注意的是,已激活的软件包列表不会在删除软件包时更新,只有在重新启动后才会更新。 - uchuugaka

17

最佳方法是规范化方法(由ataylor描述)。这里介绍了一种更加笨拙的方法。

M-x list-packages。使用C-s installed直到找到已安装包的第一行。使用C-SPC开始选择。向下滚动直到到达内置包。使用M-w复制。用C-x b新建缓冲区。用C-y粘贴。C-x C-s保存文件。

我唯一看到的优势是这个方法更为详细 —— 它显示了您的软件包的简短描述;当您安装某些软件包并忘记它们时,这很有用。


是的 - 我喜欢这比 package-activated-list 提供了更多的描述。 - Doug Harris

5

何以通过指定软件包名称自动安装Emacs软件包?所述,最好记录您需要的软件包版本。 为此,您可以使用以下功能:

(defun list-packages-and-versions ()
  "Returns a list of all installed packages and their versions"
  (mapcar
   (lambda (pkg)
     `(,pkg ,(package-desc-version
                (cadr (assq pkg package-alist)))))
   package-activated-list))

这将给出一份(名称 版本号)的列表。不幸的是,我还没有找到一种安装特定版本的包的方法。似乎package.el总是获取最新可用的版本。现在我正在做的是:

(defun install-packages-with-specific-versions (package-version-list)
  "Install the packages in the given list with specific versions.
PACKAGE-VERSION-LIST should be a list of (NAME VERSION) lists,
where NAME is a symbol identifying the package and VERSION is
the minimum version to install."
  (package-download-transaction
   (package-compute-transaction () package-version-list)))

我已经编写了一个更长的函数来安装与精确版本号匹配的软件包,但它失败了,因为package.el默认只检索每个软件包可用的最新版本。gist


1
如上所述,使用emacs正常模式。这里是evil模式的操作方式:
M-x list-packages; /installed (它们将被突出显示); v (进入可视模式); j (选择它们); y (复制它们); 打开一个新缓冲区并粘贴它们。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接