【问题标题】:How to rebuild ELPA packages after upgrade of Emacs升级 Emacs 后如何重建 ELPA 包
【发布时间】:2014-07-13 18:17:05
【问题描述】:

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

对于新版本的 Emacs 是否需要重新编译 .elc?为什么这不是 package.el 的一个特性?

【问题讨论】:

    标签: emacs elpa


    【解决方案1】:

    您不需要重新安装所有软件包。包本身可能没问题,但是它们需要重新编译,因为 Emacs Lisp 字节码通常不兼容主要版本。

    要重新编译所有包,请输入M-: (byte-recompile-directory package-user-dir nil 'force)。重启 Emacs 后,包应该会再次正常工作。

    【讨论】:

    • 我的理解是,只有在您降级(或类似)到旧的 Emacs 主要版本时,字节码兼容性才是一个问题。较新的 Emacs 版本将运行由旧 Emacs 版本编译的字节码。
    • 虽然 emacs 字节码确实保持向后兼容性,但重新编译通常是一个好主意,尤其是在移动到更高的主要版本时。原因是后来的主要版本经常引入新功能,其中一些可以提高性能或功能。
    【解决方案2】:

    这适用于 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 以交互方式为一个包工作。
    【解决方案3】:

    变量package-activated-list 保存着我们感兴趣的软件包列表。所以我们只需要重新安装每个软件包。我们不需要显式删除它们;调用package-install 会清除旧版本。

    将此代码放入暂存缓冲区并对其进行评估(即,将光标放在末尾,然后按C-x C-e):

    (dolist (package-name package-activated-list)
      (package-install package-name))
    

    【讨论】:

    • 这失败:调试器进入--Lisp 错误:(错误类型参数数组p ac-dabbrev):第 1 行:package-desc-full-name(ac-dabbrev) 第 2 行:package-安装(ac-dabbrev)
    【解决方案4】:

    我在 emacs 25 之后的食谱:

    1. 在 .emacs 中(定义您的软件包列表):
    (custom-set-variables
     '(package-selected-packages
       (quote
          (browse-kill-ring helm undo-tree use-package)))
    
    1. 在终端中:
    $ rm -rf ~/.emacs.d/elpa/*
    
    1. 在 emacs 中:
    (progn (package-refresh-contents)
        (package-install-selected-packages)
        (byte-recompile-directory package-user-dir nil 'force))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-03-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-11
      • 1970-01-01
      相关资源
      最近更新 更多