如何在升级Emacs后重建ELPA包

如何在升级Emacs后重建ELPA包,emacs,elpa,Emacs,Elpa,我刚刚在MacOS上将GNU Emacs从23升级到24,一些ELPA安装的软件包停止工作。其中之一是AucTeX。删除它并通过包管理器重新安装使它再次工作,但我不想为每个包手动执行此操作。我有点困惑,我在互联网上找不到这方面的信息 新版本的Emacs不需要重新编译.elc吗?为什么这不是package.el的一个功能?变量package activated list包含我们感兴趣的包列表。所以我们只需要重新安装每一个。我们不需要明确删除它们;调用package install将删除旧版本 将此

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


新版本的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之后我的食谱:

  • 在.emacs中(定义包列表):
  • 在终端中:
  • 在emacs中:

  • 这失败了:调试器输入--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))