我刚在MacOS上将GNU Emacs从23升级到24,一些已安装的ELPA包停止工作了。其中一个是AucTeX。通过软件包管理器删除并重新安装它可以使其再次正常工作,但我不想为每个软件包手动执行此操作。我有点困惑的是,在互联网上找不到关于这个的任何信息。
难道不需要重新编译.elc以适应新版本的Emacs吗?为什么这不是package.el的功能之一?
您不需要重新安装所有软件包。这些软件包本身可能是好的,但是它们需要重新编译,因为 Emacs Lisp 字节码通常在主要版本之间不兼容。
要重新编译所有软件包,请键入M-: (byte-recompile-directory package-user-dir nil 'force)
。重启 Emacs 后,软件包应该可以正常工作。
(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
命令即可交互式地重新安装一个软件包。 - peterhilpackage-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))