如何在升级Emacs后重建ELPA包
我刚刚在MacOS上将GNU Emacs从23升级到24,一些ELPA安装的软件包停止工作。其中之一是AucTeX。删除它并通过包管理器重新安装使它再次工作,但我不想为每个包手动执行此操作。我有点困惑,我在互联网上找不到这方面的信息如何在升级Emacs后重建ELPA包,emacs,elpa,Emacs,Elpa,我刚刚在MacOS上将GNU Emacs从23升级到24,一些ELPA安装的软件包停止工作。其中之一是AucTeX。删除它并通过包管理器重新安装使它再次工作,但我不想为每个包手动执行此操作。我有点困惑,我在互联网上找不到这方面的信息 新版本的Emacs不需要重新编译.elc吗?为什么这不是package.el的一个功能?变量package activated list包含我们感兴趣的包列表。所以我们只需要重新安装每一个。我们不需要明确删除它们;调用package install将删除旧版本 将此
新版本的Emacs不需要重新编译.elc吗?为什么这不是package.el的一个功能?变量
package activated list
包含我们感兴趣的包列表。所以我们只需要重新安装每一个。我们不需要明确删除它们;调用package install
将删除旧版本
将此代码放入暂存缓冲区并计算(即,将光标放在末尾,然后按C-x C-e
):
您不需要重新安装所有软件包。这些包本身可能很好,但是,它们需要重新编译,因为Emacs Lisp字节码通常不兼容主要版本
要重新编译所有包,请键入
M-:(字节重新编译目录包用户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)))))
emacs 25之后我的食谱:
这失败了:调试器输入--Lisp错误:(错误的类型参数arrayp ac dabbrev):第1行:包描述全名(ac dabbrev)第2行:包安装(ac dabbrev)我的理解是,只有当您降级(或类似)到较旧的主版本的Emacs时,字节码兼容性才是一个问题。较新的Emacs版本将运行由较旧的Emacs版本编译的字节码。虽然Emacs字节码确实保持向后兼容性,但通常最好重新编译,尤其是在移动到较新的主版本时。原因是,较新的主要版本通常会引入新功能,其中一些功能可以提高性能或功能。只需
M-x重新安装软件包RET package name
就可以交互地为一个软件包工作。
(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)))))
(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))