2014-07-13 10 views
32

Ich habe gerade GNU Emacs von 23 auf 24 auf MacOS aktualisiert und einige ELPA-installierte Pakete haben aufgehört zu arbeiten. Einer von ihnen ist AucTeX. Sie löschen und es durch den Paket-Manager Neuinstallation machte es wieder funktionieren, aber ich will das nicht für jedes Paket von Hand zu tun. Ich bin etwas verwirrt, dass ich im Internet nichts darüber finde.Wie man ELPA-Pakete nach dem Upgrade von Emacs wiederherstellt

Muss die .elc nicht für eine neue Emacs-Version neu kompiliert werden? Warum ist das nicht ein Feature von package.el?

Antwort

58

Sie brauchen nicht alle Pakete neu zu installieren. Die Pakete selbst sind wahrscheinlich in Ordnung, sie müssen jedoch neu kompiliert werden, da der Emacs-Lisp-Byte-Code in den meisten Versionen nicht kompatibel ist.

Um alle Pakete erneut zu kompilieren, geben Sie M-: (byte-recompile-directory package-user-dir nil 'force) ein. Nach dem Neustart von Emacs sollten die Pakete wieder funktionieren.

+0

Mein Verständnis ist, dass Byte-Code-Kompatibilität nur ein Problem, wenn Sie Herabstufung (oder ähnlich) auf eine ältere Hauptversion von Emacs. Eine neuere Emacs-Version wird ausgeführt von einer älteren Emacs-Version kompilierte Bytecode. – phils

+1

Es stimmt zwar, dass der Emacs-Byte-Code die Abwärtskompatibilität beibehält, es ist jedoch in der Regel eine gute Idee, sie neu zu kompilieren, insbesondere beim Wechsel zu einer späteren Hauptversion. Der Grund ist, dass spätere Hauptversionen oft neue Funktionen einführen und einige davon zu verbesserter Leistung oder Funktionalität führen können. –

3

Die Variable package-activated-list enthält die Liste der Pakete, an denen wir interessiert sind. Wir müssen sie also nur noch einmal installieren. Wir müssen sie nicht explizit löschen. Ein Anruf package-install wird eine alte Version wegblasen.

Setzen Sie diesen Code in einem Scratch-Puffer und auszuwerten (das heißt, am Ende setzen Sie den Cursor, und drücken Sie C-x C-e):

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

Dies schlägt fehl: Debugger eingegeben - Lisp-Fehler: (falsche-Typ-Argument arrayp ac-dabbrev): Linie 1: Paket-desc-full -name (ac-dabbrev) Zeile 2: Paket installieren (ac-dabbrev) –

1

Dies funktioniert für mich auf Emacs 25.1 und 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

Nur 'M-x Neuinstallationspaket RET Paketname' funktioniert interaktiv für ein Paket. – peterhil