【问题标题】:How to save a list of all the installed packages in Emacs 24?如何在 Emacs 24 中保存所有已安装包的列表?
【发布时间】:2012-12-01 18:08:53
【问题描述】:

我使用 prelude 作为基本 Emacs 配置。 我已经从包管理器安装了很多包,我想在另一台机器上使用我的设置。

我不想携带已安装的包,也不想手动创建列表。

将所有已安装包的列表保存到 prelude-package.el 或任何其他文件中的方法是什么,以便当我将此配置带到我的另一台机器时,它们会在第一次使用时自动安装在那里?

【问题讨论】:

    标签: emacs emacs24 dot-emacs emacs-prelude


    【解决方案1】:

    您可以从变量package-activated-list 中获取当前安装的包(不包括内置包)的列表。要在启动时自动安装它们,请参阅以下问题:how to automatically install emacs packages by specifying a list of package names?

    更具体地说,如果您执行 Ch v package-activated-list,复制显示的值,并将其作为 prelude-packages 的值插入,emacs 将自动确保这些包在启动时安装起来。

    【讨论】:

    • 值得注意的是,激活包列表并不是通过删除包来更新的,而是似乎只有在重启时才会更新。
    【解决方案2】:

    规范方法是最好的(由 ataylor 描述)。这是一个更笨拙的方法。

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

    我看到的唯一优点是这更具描述性。显示您的包裹的简短描述。当您安装一些软件包而忘记它时很有用。

    【讨论】:

    • 是的 - 我喜欢这比 package-activated-list 增加了一点描述
    【解决方案3】:

    正如how to automatically install emacs packages by specifying a list of package names? 中提到的,最好也记录下你需要的包的版本。为此,您可以使用以下函数:

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

    这将为您提供(NAME VERSION) 对的列表。不幸的是,我还没有找到安装特定版本软件包的方法。似乎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

    【讨论】:

      【解决方案4】:

      如上所述,使用 emacs 普通模式。这是另一种邪恶模式的做法:

      M-x 列表包; /installed(它们将被突出显示); v(视觉模式); j(选择它们); y(复制它们);打开一个新的缓冲区并粘贴它们。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-04-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-02-23
        • 1970-01-01
        • 2012-10-08
        • 2016-10-09
        相关资源
        最近更新 更多