【发布时间】:2014-07-13 18:17:05
【问题描述】:
我刚刚在 MacOS 上将 GNU Emacs 从 23 升级到 24,一些 ELPA 安装包停止工作。其中之一是 AucTeX。删除它并通过包管理器重新安装它使它再次工作,但我不想为每个包手动执行此操作。我有点困惑,我在互联网上没有找到任何相关信息。
对于新版本的 Emacs 是否需要重新编译 .elc?为什么这不是 package.el 的一个特性?
【问题讨论】:
我刚刚在 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)))))
【讨论】:
M-x reinstall package RET 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))
【讨论】: