2014-07-13 42 views
32

我剛剛在MacOS上將GNU Emacs從23升級到24,並且一些ELPA安裝包停止工作。其中之一是AucTeX。刪除它並通過軟件包管理器重新安裝後,它再次運行,但我不想爲每個軟件包手動執行此操作。我有點困惑,我沒有在互聯網上找到任何有關這方面的信息。如何在Emacs升級後重建ELPA包

不需要爲新版本的Emacs重新編譯.elc嗎?爲什麼這不是package.el的特性?

回答

58

你並不需要重新安裝所有的軟件包。包本身可能很好,但是,它們需要重新編譯,因爲Emacs Lisp字節碼通常在主要版本中不兼容。

要重新編譯所有包,請鍵入M-: (byte-recompile-directory package-user-dir nil 'force)。重新啓動Emacs後,包應該再次正常工作。

+0

我的理解是,如果您要降級(或類似)到較早的主要版本的Emacs,字節碼兼容性只是一個問題。較新的Emacs版本將運行由舊版Emacs編譯的字節碼。 – phils

+1

儘管emacs字節代碼確實保持向後兼容性,但重新編譯通常是一個好主意,尤其是在轉移到更高版本的主要版本時。原因在於後來的主要版本經常會引入新的功能,其中一些可能會導致性能或功能的改進。 –

3

變量package-activated-list包含我們感興趣的軟件包列表。所以我們只需要再次安裝每個軟件包。我們不需要明確刪除它們;呼籲package-install將吹走舊版本。

將這個代碼在臨時緩衝區,並評估它(也就是,把你的光標在最後,並按C-x C-e):

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

這種失敗:調試進入 - Lisp的錯誤:(錯誤的類型參數arrayp AC-dabbrev):第1行:包遞減全-name(ac-dabbrev)第2行: package-install(ac-dabbrev) –

1

這對我的作品在Emacs的25.1和26:

(defun package-reinstall-activated() 
    "Reinstall all activated packages." 
    (interactive) 
    (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)))))) 
+0

只要'M-x重新安裝包RET包名稱'交互式地爲一個包工作。 – peterhil