Emacs 24: Laden eines über ELPA installierten Pakets

4493
Chen Levy

Ich habe das cmake-modePaket gerade in Emacs 24 installiert :

M-x package-install cmake-mode 

Ich kann das Paket unter: sehen ~/.emacs.d/elpa/cmake-mode-20110824und kann es mit der Anweisung in Commentary:Abschnitt von laden ~/.emacs.d/elpa/cmake-mode-20110824/cmake-mode.el:

;; Add this code to your .emacs file to use the mode: ;; ;; (setq load-path (cons (expand-file-name "/dir/with/cmake-mode") load-path)) ;; (require 'cmake-mode) ;; (setq auto-mode-alist ;; (append '(("CMakeLists\\.txt\\'" . cmake-mode) ;; ("\\.cmake\\'" . cmake-mode)) ;; auto-mode-alist)) 

Dies widerspricht jedoch den Verwendungsanweisungen auf der EmacsWiki-Seite von ELPA:

... Pakete werden NACH dem Laden von init.el initialisiert. Dies bedeutet, dass Sie KEINE paketspezifische Initialisierung in Ihre init.el einfügen sollten ...

Ich neige dazu, dieser Anweisung zuzustimmen, weil in meiner ~/.gnu-emacsDatei eine Zeile wie folgt hinzugefügt wird :

(add-to-list 'load-path "~/.emacs.d/elpa/cmake-mode-20110824/") 

ist hässlich und bricht, wenn und wenn ich das Paket aktualisieren werde. Ohne diese Leitung kann ich jedoch nicht verwenden cmake-mode.

Fehlt mir hier etwas?

Anmerkungen:

  • Ich habe nichts seltsames mit gemacht package-enable-at-startupund sein Wert ist t.
  • Ich benutze Vorspiel .
  • user-emacs-directoryWert ist "~/.emacs.d/" (Danke @lawlist für den Vorschlag)
  • package-user-dir Wert ist "~/.emacs.d/elpa"
12
Is it possible you have altered the locations of the `default-directory` or the `user-emacs-directory`, such that the `elpa` directory is not being loaded? `package-install` creates an `elpa` directory and the autoloads file that is created during the installation is based on that location. lawlist vor 11 Jahren 1
Ihre letzte Codezeile in Ihrer Frage deutet darauf hin, dass Sie das Paket aus dem `elpa`-Verzeichnis verschoben haben. Dh, ~ / .emacs.d / cmake-mode-20110824 /` befindet sich nicht dort, wo die Datei autoloads erwartet . lawlist vor 11 Jahren 1
@lawlist: Du bist sehr aufmerksam. Ich habe einen Fehler in der Frage gemacht. Es ist jetzt (die Frage) auf den korrekten Wert von ~ / .emacs.d / elpa / cmake-mode-20110824 / `festgelegt. Das Problem bleibt bestehen. Chen Levy vor 11 Jahren 0

4 Antworten auf die Frage

3
Aaron Miller

In Anbetracht der Natur des Wikis als Half-Code-Repository, als Half- Aide-Memoire für Emacs-Hacker, haben Sie diesen Punkt verständlicherweise übersehen:

Es ist möglicherweise einfacher, die Paketinitialisierung während des Startvorgangs an einen anderen Punkt zu verschieben, damit Sie ELPA-Pakete (benötigen) können. Dies kümmert sich um viele der beschriebenen Probleme:

Das ist was ich mache; Eine der ersten Dateien, die von meinem benutzerdefinierten Init-Skript geladen wurden (dessen Erstellung von allem, was ich entnehmen kann, ist das Pons asinorum der ernsthaften Emacs-Verwendung 1 )

(require 'package) (setq package-enable-at-startup nil) (package-initialize) 

und von da aus einfach (require)die ELPA-Pakete, die ich brauche. Dies hat auch den Vorteil, dass das Verhalten von mit ELPA installierten Paketen genauer kontrolliert werden kann. Wenn ich beispielsweise ein bestimmtes Paket vorübergehend deaktivieren, es aber nicht vollständig deinstallieren möchte, muss der betreffende (require)Aufruf einfach auskommentiert werden, wobei das Standardverhalten das vollständige Entfernen des Pakets aus meinem ELPA-Verzeichnis erfordert.

(1. Trotz fast überwältigender Versuchung habe ich es abgelehnt, mein benutzerdefiniertes Init-Skript zu nennen lightsaber.el.)

Nur eine Erinnerung an das * user-emacs-verzeichnis *, wenn sich ELPA-Pakete standardmäßig dort befinden. Ich bewahre meine Sachen in Dropbox auf und war erstaunt, als ich mit dem Batch-Skript über die obigen Befehle störte. mlt vor 10 Jahren 0
2
lawlist

Ich habe den cmake-mode mit dem marmalade-repo installiert und einen Blick auf cmake-mode-autoloads.el geworfen. Es scheint, dass der Autor eine bewusste Entscheidung getroffen hat, notalles, was für das Setup benötigt wird, in die Autoloads-Datei aufzunehmen. Die Anweisungen in den Zeilen 25 bis 30 von cmake-mode.el sind jedoch korrekt, was Sie in Ihrer Frage zitiert haben. Wenn Sie die Zeilen 25 bis 30 verwenden und den Pfad richtig einstellen, benötigen Sie KEINE zusätzliche Codezeile wie (add-to-list 'load-path "~/.emacs.d/elpa/cmake-mode-20110824/").

Natürlich möchten Sie nicht verwenden /dir/with/cmake-mode- Sie möchten ~/.emacs.d/elpa/cmake-mode-20110824ohne Vorwärtsstrich am Ende verwenden.

(setq load-path (cons (expand-file-name "~/.emacs.d/elpa/cmake-mode-20110824") load-path)) (require 'cmake-mode) (setq auto-mode-alist (append '(("CMakeLists\\.txt\\'" . cmake-mode) ("\\.cmake\\'" . cmake-mode)) auto-mode-alist)) 

Möglicherweise müssen Sie das Verzeichnis c-make-mode ... löschen und eine Neuinstallation durchführen, wenn der obige Code nicht funktioniert (mit einem eigenen Pfad).

Sicher, aber wenn mir etwas fehlt, wenn Sie den cmake-mode später über ELPA aktualisieren, wird entweder das Verzeichnis in etwas umbenannt, das nicht in Ihrer init-Datei enthalten ist, oder die neuere Version landet in einem Verzeichnis, das sich nicht im Ladepfad befindet. Im letzteren Fall wird das Update entweder nicht angezeigt oder es kommt zu einer unzulässigen Verrücktheit, weil Sie manuell eine Version laden und `(package-initialize)` eine andere lädt. Liege ich falsch? Ich meine, ich habe ELPA nicht viel benutzt und habe noch keine Pakete damit aktualisiert, daher könnte ich mich irren. Sicher, es ist auf keinen Fall ein wichtiges Anliegen, aber warum sollte man es nicht gänzlich vermeiden? Aaron Miller vor 11 Jahren 0
Du hast Recht. Die Pakete aktualisieren sich jedoch nicht einfach selbst, ohne dass Sie davon erfahren - wenn und wenn Sie ein Update durchführen, wäre dies der Zeitpunkt, um Ihre Zimmerreinigung zu erledigen. Ich investiere häufig viel Zeit, um die Quelldateien verschiedener Pakete zu ändern, und ich möchte nicht unbedingt, dass sie aktualisiert werden, nachdem ich sie die ganze Zeit damit verbracht habe, sie genau richtig zu machen. Emacs ist alles andere als "wartungsfrei". lawlist vor 11 Jahren 0
Ein ausgezeichneter Punkt. Aaron Miller vor 11 Jahren 0
1
Poulsbo

Sie können einfach alle Initialisierungen nach dem Laden von Paketen mit verwenden after-init-hook. Aus EmacsWiki :

;; init.el (add-hook 'after-init-hook (lambda () (load "<real init file>"))) 
0
Dmytro

Ich hatte ein ähnliches Problem, als ich mit ELPA begann. In meinem Fall hatte ich mehrere lokale Pakete, da diese in ELPA nicht vorhanden waren.

Und so hatte ich Lastpfad geändert. Aus irgendeinem Grund wird load-path von package.el nicht ordnungsgemäß aktualisiert. Um das Problem zu lösen, musste ich (setq load-path (cons "~/.emacs.d" load-path)) nach dem Anruf anstellenpackage-initialize