TL; DR:
Fügen Sie die folgende Zeile oben in Ihre Init-Datei ein ( .emacs.d/init.el
oder .emacs
):
(package-initialize)
Die Erklärung
Es user-init-file
ist definitiv nicht der richtige Ansatz, mehr von den Dateien zu erstellen, die Emacs verwenden könnte . Da das Handbuch nicht sagen , was in dem Fall bevorzugt wird , gibt es einen Konflikt, zumindest nicht in dem Teil , den Sie zitiert, all dies tut , ist fügen Verwirrung - jetzt wissen wir nicht , was eigentlich das ist user-init-file
(deren Wert Sie möchten zu inspizieren, um herauszufinden).
Entfernen Sie daher zunächst alle Kandidaten, mit Ausnahme ~/.emacs.d/init.el
derjenigen, die (von den Benutzern) im Allgemeinen bevorzugt werden, da dies nicht zu dem unheiligen Durcheinander beiträgt $HOME
und es Ihnen ermöglicht, alle Emacs-Konfigurationsdateien, einschließlich der wichtigsten, unter Versionskontrolle zu halten, indem Sie nur ein Repository für verwenden Emacs.
Standardmäßig ruft Emacs auf, package-initialize
nachdem die Init-Datei des Benutzers geladen wurde. Er tut dies überhaupt , weil heutzutage die meisten Benutzer ihre Pakete mit installieren package.el
- so sollten sie nichts zu tun haben , für diese Pakete zur Verfügung gestellt werden.
Auf der anderen Seite tut das nicht jeder , daher sollte es möglich sein, nicht anzurufen package-initialize
. Um zu verhindern, dass diese Funktion aufgerufen wird, fügen Sie (setq package-enable-at-startup nil)
sie der Init-Datei des Benutzers hinzu (wo können Sie sie sonst ablegen?).
package-initialize
kann nicht aufgerufen werden, bevor der Benutzer eine Änderung vorgenommen hat, um Emacs anzuweisen, dies nicht zu tun, und muss daher nach dem Laden der Init-Datei durchgeführt werden. Solange der Benutzer nur Pakete installiert und sie dann unverändert verwendet oder über die Benutzeroberfläche anpasst, funktioniert dies einwandfrei. Wenn Sie Ihre Pakete jedoch mithilfe von elisp anpassen möchten, müssen Sie sicherstellen, dass sie tatsächlich auf dem neuesten Stand sind, load-path
bevor Sie die von ihnen definierten Funktionen verwenden.
Das ist ziemlich einfach und richtig dokumentiert (wenn ich das zuerst nachgeschlagen hätte, hätte ich die meisten der oben genannten Dinge nicht schreiben müssen: - /
Der Grund für das automatische Laden von Paketen nach dem Laden der Init-Datei ist, dass Benutzeroptionen erst nach dem Laden der Init-Datei ihre benutzerdefinierten Werte erhalten, einschließlich Benutzeroptionen, die sich auf das Verpackungssystem auswirken. Unter bestimmten Umständen möchten Sie möglicherweise Pakete explizit in Ihre 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 Funktion aufrufen package-initialize
. Sie müssen sicherstellen, dass relevante Benutzeroptionen wie package-load-list
(siehe unten) vor dem package-initialize
Anruf eingerichtet werden. Sie sollten auch festlegen,
package-enable-at-startup
umnil
, um zu vermeiden, dass die Pakete nach der Verarbeitung der Init-Datei erneut geladen werden. Alternativ können Sie das Laden von Paketen beim Start vollständig unterbinden und den Befehl `Mx package-initialize 'aufrufen, um Ihre Pakete manuell zu laden.
So:
;;; .emacs.d/init.el -- the `user-init-file'
(package-initialize)
(setq package-enable-at-startup nil)
(require 'use-package)
(use-package some-package
:init (setq some-package-variable "foobar")
...
;;; .emacs.d/init.el ends here
Das Problem (oder ein zusätzliches Problem) könnte natürlich auch sein, dass sich der Tippfehler Symbol's function definition is void: use-packge
in Ihrer Init-Datei befindet und erst dann aufgetreten ist, wenn Sie ihn in emacs.se eingegeben haben.