我刚刚在 MacOS 上将 GNU Emacs 从 23 升级到 24,一些 ELPA 安装包停止工作。其中之一是 AucTeX。删除它并通过包管理器重新安装它使其再次工作,但我不想为每个包手动执行此操作。我有点困惑,我在互联网上没有找到任何相关信息。
不需要为新版本的 Emacs 重新编译 .elc 吗?为什么这不是 package.el 的一个特性?
您不需要重新安装所有软件包。这些包本身可能很好,但是,它们需要重新编译,因为 Emacs Lisp 字节码通常在主要版本之间不兼容。
要重新编译所有包,请键入M-: (byte-recompile-directory package-user-dir nil 'force)
. 重新启动 Emacs 后,包应该可以再次正常工作。
这适用于 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)))))
该变量package-activated-list
包含我们感兴趣的软件包列表。所以我们只需要再次安装每个软件包。我们不需要显式删除它们;调用package-install
将吹走旧版本。
将此代码放入暂存缓冲区并对其进行评估(即,将光标放在末尾,然后按C-x C-e
):
(dolist (package-name package-activated-list)
(package-install package-name))
我在emacs 25之后的食谱:
(custom-set-variables '(package-selected-packages (quote (browse-kill-ring helm undo-tree use-package)))
$ rm -rf ~/.emacs.d/elpa/*
(progn (package-refresh-contents) (package-install-selected-packages) (byte-recompile-directory package-user-dir nil 'force))