Sie unterscheiden sich, wenn das Paket zurückgestellt wird, dh erst geladen wird, wenn es benötigt wird. In diesem Fall :init
wird sie zum Zeitpunkt des ersten Lesens Ihrer emacs-Datei :config
ausgeführt , jedoch zum Zeitpunkt des tatsächlichen Ladens des Pakets.
In Ihrem Beispiel mode
verzögert die Verwendung von implizit das Laden des Pakets. Sie haben das Paket so konfiguriert, dass es beim ersten Aufrufen einer HTML-Datei geladen wird.
Sie könnten :demand
sicherstellen, dass das Paket immer beim Start geladen wird, aber mit größerer Wahrscheinlichkeit setzen Sie Ihren Haken in das, was Sie hier tun möchten :init
.
Aus dem Dokumentationsstring:
:init Code to run when `use-package' form evals.
Da Sie dies in Ihre Benutzer-Init-Datei einfügen, bedeutet dies im Grunde, dass es beim Start ausgeführt wird.
:config Runs if and when package loads.
Also nicht ausführen, bis das Paket tatsächlich geladen wird.
:defer Defer loading of package -- automatic if :commands, :bind, :bind*, :mode or :interpreter are used.
Beachten Sie die Liste der Dinge, die ein Paket automatisch zurückstellen. Wenn Sie use-package
die Bedingungen angeben, unter denen Sie dieses Paket benötigen, wird davon ausgegangen, dass Sie es erst laden möchten, wenn diese Bedingungen vorliegen.
:demand Prevent deferred loading in all cases.
Stellen Sie sicher, dass das Paket beim Start geladen wird, unabhängig von den anderen von Ihnen angegebenen Optionen.
Aktualisieren
Dies basierend auf den jüngsten Kommentaren noch einmal zu überprüfen ... Was ich oben gesagt habe, ist alles wahr, aber ich denke nicht, dass es die Frage richtig beantwortet. Das eigentliche Problem hierbei ist, dass html-mode
es sich nicht um ein Paket handelt, sondern um einen vom Paket definierten Modus sgml-mode
. Das funktioniert bei mir wie erwartet:
(use-package sgml-mode
:mode ("\\.html\\'" . html-mode)
:config (add-hook 'html-mode-hook 'turn-off-auto-fill))
Im ursprünglichen Beispiel wird der :config
Ausdruck nie ausgewertet, da ein Paket mit dem Namen html-mode
nie geladen wird. Das Verschieben desselben Ausdrucks :init
funktioniert, da der Init-Code immer ausgewertet wird, unabhängig davon, ob das Paket jemals geladen wird.
:idle
ziemlich häufig und habe die Auswirkungen von ": Leerlauf wurde entfernt" nicht untersucht.auto-fill
nicht deaktiviert ist, dh der Konfigurationscode nicht ausgeführt wird. Ich habe das gleiche Problem.html-mode
es sich nicht um ein Paket handelt. Zumindest in meiner aktuellen Emacs-Versionhtml-mode
ist das im Paket definiertsgml-mode
. Wenn Sieuse-package
also beimhtml-mode
Laden eines Pakets mit dem Namen auffordern, etwas zu tun, wird dieser Code nie ausgeführt, da niemals ein solches Paket geladen wird. Sie müssen das HTML-Modus-Setup in a einfügen(use-package sgml-mode ....)
.org-mode
, nichthtml-mode
. Ein ähnliches Problem besteht darin, dass das Paket aufgerufen wirdorg-mode
, aber das ELPA-Paket aufgerufen wirdorg
. Vielleicht ist das verwirrend (oder ich)?Dieses Beispiel hat es mir sehr leicht gemacht, den Unterschied zwischen
:init
und zu verstehen:config
. Nehmen wir ein Beispiel für einace-window
Paket (dies kann jedoch ein beliebiges Paket sein). Fügen Sie dies in Ihreinit.el
Datei ein:Jetzt öffne deinen Emacs und sieh im
*Messages*
Puffer nach, ob es irgendeinehello world
Nachricht gibt. Sie können keine finden, da das Paket zurückgestellt wird. Wechseln Sie nun vonconfig
zuinit
:Schließen Sie nun den Emac und öffnen Sie ihn erneut. Überprüfen Sie den
*Messages*
Puffer. Die Meldung wird angezeigt,ace window: hello world
da der Code ausgeführt wird, unabhängig davon, wann er:init
angegeben wurde. In diesem Fallconfig
wird es nur ausgeführt, wenn dieses Paket geladen ist.quelle
:init
und:preface
Ihrem Beispiel?:preface
wird ausgeführt, auch wenn das betreffende Paket deaktiviert ist, wohingegen:init
es nur ausgeführt wird, wenn ein Paket aktiviert ist.