63

我刚刚在 MacOS 上将 GNU Emacs 从 23 升级到 24,一些 ELPA 安装包停止工作。其中之一是 AucTeX。删除它并通过包管理器重新安装它使其再次工作,但我不想为每个包手动执行此操作。我有点困惑,我在互联网上没有找到任何相关信息。

不需要为新版本的 Emacs 重新编译 .elc 吗?为什么这不是 package.el 的一个特性?

4

4 回答 4

111

您不需要重新安装所有软件包。这些包本身可能很好,但是,它们需要重新编译,因为 Emacs Lisp 字节码通常在主要版本之间不兼容。

要重新编译所有包,请键入M-: (byte-recompile-directory package-user-dir nil 'force). 重新启动 Emacs 后,包应该可以再次正常工作。

于 2014-07-14T11:19:21.823 回答
6

这适用于 Emacs 25.1 和 26:

(defun package-reinstall-all-activated-packages ()
  "Refresh and reinstall all activated packages."
  (interactive)
  (package-refresh-contents)
  (dolist (package-name package-activated-list)
    (when (package-installed-p package-name)
      (unless (ignore-errors                   ;some packages may fail to install
                (package-reinstall package-name))
        (warn "Package %s failed to reinstall" package-name)))))
于 2016-10-26T21:24:24.820 回答
4

该变量package-activated-list包含我们感兴趣的软件包列表。所以我们只需要再次安装每个软件包。我们不需要显式删除它们;调用package-install将吹走旧版本。

将此代码放入暂存缓冲区并对其进行评估(即,将光标放在末尾,然后按C-x C-e):

(dolist (package-name package-activated-list)
  (package-install package-name))
于 2014-07-14T07:23:41.357 回答
2

我在emacs 25之后的食谱:

  1. 在 .emacs 中(定义你的包列表):
(custom-set-variables
 '(package-selected-packages
   (quote
      (browse-kill-ring helm undo-tree use-package)))
  1. 在终端中:
$ rm -rf ~/.emacs.d/elpa/*
  1. 在 emacs 中:
(progn (package-refresh-contents)
    (package-install-selected-packages)
    (byte-recompile-directory package-user-dir nil 'force))
于 2018-09-18T16:56:44.033 回答