Emacs 24 Package System Initialisierungsprobleme

Es scheint mir, dass das neue Paketsystem, das in Emacs 24 integriert ist, einige Mängel aufweist, wenn es darum geht, die installierten Pakete richtig zu laden und zu initialisieren.

Vor kurzem habe ich ein Upgrade auf Emacs 24.1.1 durchgeführt, das am 6.10.2012 veröffentlicht wurde. Ich habe versucht, das integrierte Paketsystem zu verwenden und habe mehrere Pakete mit diesem Paket installiert, aber alle haben ein ähnliches Problem mit Autoload und Initialisierung.

Zum Beispiel verwende ich ein Paket namens smex , das Verbesserungen für die Verwendung des Mx Akkords bietet. Sie müssen einen Schlüssel für Mx , also habe ich (global-set-key (kbd "Mx") 'smex) in meine init.el Datei init.el . Aber nachdem ich emacs gestartet habe, drücke ich den Mx Akkord und erhalte die Meldung “Symbols functionsdefinition ist void: smex” … Wenn ich auch (require 'smex) in meine init.el-Datei lege, bekomme ich die Fehlermeldung “File error: Load-Datei kann nicht geöffnet werden, smex “

Das Hinzufügen der Position von smex zu der Ladepfadvariable führt dazu, dass es wie erwartet funktioniert, jedoch scheint dies den ganzen Zweck zu besiegen, ein Paketsystem überhaupt zu haben …

Irgendwelche Gedanken? Gibt es einen besseren Weg oder leben wir jetzt mit dieser Einschränkung?

Die Pakete, die Sie mit package.el installieren, sind standardmäßig aktiviert, nachdem Ihre .emacs geladen wurde. Um sie vor dem Ende Ihrer .emacs , müssen Sie sie mit folgenden Befehlen aktivieren:

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

Es ist erwähnenswert, warum Emacs die Initialisierung des Pakets verzögert:

Siehe (emacs) Package Installation RET , und insbesondere:

Der Grund für das automatische Laden von Paketen nach dem Laden der Init-Datei besteht darin, dass Benutzeroptionen erst nach dem Laden der Init-Datei ihre angepassten Werte erhalten, einschließlich der Benutzeroptionen, die sich auf das Verpackungssystem auswirken. Unter Umständen möchten Sie Pakete explizit in Ihrer Init-Datei laden (normalerweise, weil ein anderer Code in Ihrer Init-Datei von einem Paket abhängt). In diesem Fall sollte Ihre Init-Datei die function package-initialize aufrufen. Es liegt an Ihnen, sicherzustellen, dass relevante Benutzeroptionen wie die package-load-list (siehe unten) vor dem package-initialize . Sie sollten package-enable-at-startup auf nil , um zu vermeiden, dass die Pakete nach der Verarbeitung der init-Datei erneut package-enable-at-startup werden. Alternativ können Sie das Laden des Pakets beim Start vollständig verhindern und den Befehl Mx package-initialize aufrufen, um Ihre Pakete manuell zu laden.

Wenn Sie sicherstellen, dass Ihre init-Datei alle nicht standardmäßigen Werte berücksichtigt, die Sie für Variablen in der Paketanpassungsgruppe 1 verwenden möchten, bevor Sie package-initialize aufrufen – und diese Vorgehensweise bei der Anpassung der Paketbibliothekskonfiguration beibehalten okay, das zu tun.

Alternativ dazu können Sie, after-init-hook nach der Initialisierung des Standardpakets die Ausführung von after-init-hook ausgeführt haben, diesen verwenden, um alle Init-Codes auszuwerten, die von Paketen abhängen. Anstatt also direkt in init.el package-initialize aufzurufen, könnte man stattdessen schreiben:

 (add-hook 'after-init-hook 'my-after-init-hook) (defun my-after-init-hook () ;; do things after package initialization ) 

Setzen des Codes, der das initialisierte Paketsystem benötigt, innerhalb dieser function.

YMMV.

(Ich habe den After-Init-Ansatz nicht getestet, da ich package.el nicht wirklich verwende; aber ich habe die Reihenfolge der Ereignisse im Startcode bestätigt, daher glaube ich, dass es wie beschrieben funktioniert.)

1 Mx customize-group RET- package RET