Emacs 24: Laden eines über ELPA installierten Pakets

12

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

M-x package-install cmake-mode

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

;; 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 der Gebrauchsanweisung auf der EmacsWiki-Seite von ELPA:

... Pakete werden initialisiert, nachdem die Datei init.el geladen wurde. Dies bedeutet, dass Sie KEINE paketspezifische Initialisierung in Ihre init.el ...

Ich stimme dieser Anweisung eher zu, da ich meiner ~/.gnu-emacsDatei eine Zeile wie die folgende hinzufüge :

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

ist hässlich und wird kaputt gehen, wenn ich das Paket aktualisiere. Ohne diese Leitung kann ich sie jedoch nicht verwenden cmake-mode.

Vermisse ich hier etwas?

Anmerkungen:

  • Ich habe nichts Seltsames gemacht package-enable-at-startupund sein Wert ist t.
  • Ich benutze den Auftakt .
  • user-emacs-directoryWert ist "~/.emacs.d/" (Danke @lawlist für den Vorschlag)
  • package-user-dir Wert ist "~/.emacs.d/elpa"
Chen Levy
quelle
1
Ist es möglich, dass Sie die Speicherorte des default-directoryoder des user-emacs-directoryso geändert haben , dass das elpaVerzeichnis nicht geladen wird? Erstellt package-installein elpaVerzeichnis und die Autoloads-Datei, die während der Installation erstellt wird, basiert auf diesem Speicherort.
Lawlist
1
Ihre letzte Codezeile in Ihrer Frage deutet darauf hin, dass Sie das Paket aus dem elpaVerzeichnis verschoben haben - dh ~/.emacs.d/cmake-mode-20110824/nicht dort, wo die Autoloads-Datei dies erwartet.
Lawlist
@lawlist: Du bist sehr aufmerksam. Ich habe einen Fehler in der Frage gemacht. Es ist jetzt (die Frage) auf den korrekten Wert von festgelegt ~/.emacs.d/elpa/cmake-mode-20110824/. Das Problem bleibt bestehen.
Chen Levy

Antworten:

2

Ich habe den cmake-Modus mit dem Marmeladen-Repo installiert und mir cmake-mode-autoloads.el angesehen. 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, die Sie in Ihrer Frage zitiert haben. Wenn Sie die Zeilen 25 bis 30 verwenden und den Pfad korrekt einstellen, benötigen Sie KEINE zusätzliche Codezeile wie z (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ärtsspiel 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 versuchen, wenn der obige Code nicht funktioniert (unter Verwendung Ihres eigenen Pfads).

Gesetzesliste
quelle
Sicher, aber es sei denn, ich vermisse etwas, wenn Sie später den cmake-Modus ü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 in Ihrem Ladepfad befindet. Im letzteren Fall wird das Update entweder nicht angezeigt oder Sie werden übermäßig verrückt, weil Sie eine Version manuell laden und (package-initialize)eine andere laden. Liege ich falsch? Ich meine, ich habe ELPA nicht viel benutzt und muss noch irgendwelche Pakete damit aktualisieren, also könnte ich mich irren. Und natürlich ist es auf keinen Fall ein großes Problem, aber warum nicht ganz vermeiden?
Aaron Miller
Du hast Recht. Die Pakete aktualisieren sich jedoch nicht einfach selbst, ohne dass Sie davon erfahren. Wenn Sie ein Update durchführen, ist dies der richtige Zeitpunkt für Ihre Haushaltsführung. 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 die ganze Zeit damit verbracht habe, sie genau richtig zu machen. Emacs ist weit entfernt von dem, was man als "wartungsfrei" bezeichnen könnte.
Lawlist
Ein ausgezeichneter Punkt.
Aaron Miller
3

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

Es könnte einfacher sein, die Paketinitialisierung während des Startvorgangs an einen anderen Punkt zu verschieben, damit Sie ELPA-Pakete (benötigen) können. Dies behebt viele der beschriebenen Probleme:

Das ist was ich mache; Eine der ersten Dateien, die von meinem benutzerdefinierten Init-Skript geladen wurden (deren Erstellung, soweit ich das beurteilen kann, das Pons Asinorum der ernsthaften Verwendung von Emacs 1 ist )

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

und von dort habe ich einfach (require)welche ELPA-pakete ich brauche. Dies hat auch den Vorteil, dass das Verhalten von ELPA-installierten Paketen genauer gesteuert werden kann. Wenn ich beispielsweise ein bestimmtes Paket für den Moment deaktivieren, aber nicht vollständig deinstallieren (require)möchte, muss lediglich der entsprechende Aufruf auskommentiert werden, bei dem das Standardverhalten das vollständige Verschieben des Pakets aus meinem ELPA-Verzeichnis erfordern würde.

(1. Trotz fast überwältigender Versuchung weigerte ich mich, mein benutzerdefiniertes Init-Skript zu benennen lightsaber.el.)

Aaron Miller
quelle
Nur eine Erinnerung, um das Benutzer-Emacs-Verzeichnis zu überprüfen, wenn es geändert wird, da sich dort standardmäßig ELPA-Pakete befinden. Ich behalte meine Sachen in Dropbox und war überrascht, dass die obigen Befehle in meinem Batch-Skript keine Auswirkungen haben, bis ich sie eingestellt habe.
Mlt
1

Sie können einfach Ihre gesamte Initialisierung durchführen, nachdem Pakete mit geladen wurden after-init-hook. Aus EmacsWiki :

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

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

Und so hatte ich den Lastweg geändert. Aus irgendeinem Grund wird der Ladepfad 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 an setzenpackage-initialize

Dmytro
quelle