如何在升级Emacs后重新构建ELPA包

71

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

难道不需要重新编译.elc以适应新版本的Emacs吗?为什么这不是package.el的功能之一?

4个回答

130

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

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


1
我的理解是,只有在降级(或类似情况)到一个较旧的Emacs主版本时,字节码兼容性才是一个问题。新版本的Emacs将能够运行由旧版本的Emacs编译的字节码。 - phils
8
尽管 Emacs 字节码保持向后兼容,但通常重新编译是个好主意,特别是升级到较新的主版本时。原因是较新的主版本通常会引入新功能,其中一些可能会产生更好的性能或功能。 - Tim X

10
这对于我在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)))))

1
只需使用M-x reinstall package RET package-name命令即可交互式地重新安装一个软件包。 - peterhil

5

package-activated-list变量保存了我们感兴趣的软件包清单。因此,我们只需要重新安装每个软件包即可。我们不需要明确删除它们;调用package-install会覆盖旧版本。

将此代码放入临时缓冲区并评估它(也就是把光标放在末尾,然后按下C-x C-e):

(dolist (package-name package-activated-list)
  (package-install package-name))

1
这个失败了:调试器进入——Lisp错误:(wrong-type-argument arrayp ac-dabbrev):第1行:package-desc-full-name(ac-dabbrev) 第2行:package-install(ac-dabbrev) - Ian Kelling

2

我的Emacs 25 配置:

  1. 在 .emacs 文件中(定义您的软件包列表):
(custom-set-variables
 '(package-selected-packages
   (quote
      (browse-kill-ring helm undo-tree use-package)))
在终端中执行以下命令:
$ rm -rf ~/.emacs.d/elpa/*
  1. 在Emacs中:
(progn (package-refresh-contents)
    (package-install-selected-packages)
    (byte-recompile-directory package-user-dir nil 'force))

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