Antworten:
Gibt es eine Regel, nach der der Benutzer bestimmen kann, ob die Paketkonfiguration dies erfordert
:init
oder nicht:config
?
Es gibt keine allgemeine Regel, die für alle Einstellungen und Pakete gilt. Sie müssen nur sich mit der Bedeutung dieser Schlüsselwörter durch das Lesen der vertraut zu machen Readme - Datei von use-package
.
Zusammenfassend wird der :init
Block beim Start ausgeführt, als hätten Sie seine konstituierenden Formulare auf der obersten Ebene (dh außerhalb eines typischen Aufrufs an use-package
) Ihres Systems platziert user-init-file
. Dies bedeutet, dass sie immer ausgeführt werden, unabhängig davon, ob das entsprechende Paket geladen wurde oder nicht.
Der :config
Block hingegen wird nach dem Laden des entsprechenden Pakets über den eval-after-load
Mechanismus ausgeführt.
Auf diese Weise können Sie die Startzeit verbessern, indem Sie die entsprechenden Einstellungen für lange Laufzeiten von :init
nach verschieben :config
. Wenn Sie eine Variable ändern müssen, die erst nach dem Laden eines bestimmten Pakets definiert wird, müssen Sie diese ebenfalls in den :config
Block einfügen. Einige Variablen, wie z. B. gnus-home-directory
, müssen vor dem Laden des entsprechenden Pakets festgelegt werden, daher sollten sie in platziert werden :init
. Ich empfehle dringend, alle zutreffenden add-hook
/ remove-hook
Aufrufe in den :init
Block zu setzen, da Hooks auch im ungebundenen Zustand geändert werden können und dies Ihrem Setup mehr Modularität verleiht.
Sie müssen häufig nicht herausfinden, wo eine bestimmte Einstellung platziert werden soll, indem Sie das neue :custom
Schlüsselwort oder die Benutzeroberfläche für die einfache Anpassung direkt verwenden.
Ich bin nicht sicher, ob es eine allgemeine Regel gibt (abgesehen von "Verwendung :init
zur Vorkonfiguration vor dem eigentlichen Laden des Pakets und Verwendung :config
für andere Konfigurationen").
Ich selbst verwende es :init
jedoch, wenn ich zum Beispiel einige andere Tastenkombinationen für die Moduszuordnung hinzufügen möchte, um Funktionen aus "diesem" Paket zu verwenden. Und wollen immer noch, dass "dieses" Paket faul geladen wird.
Hier ist das Beispiel des faulen Ladens von dired-ranger
:
(use-package dired-ranger
:commands (dired-ranger-copy dired-ranger-paste dired-ranger-move)
:init
(add-hook 'dired-mode-hook
(lambda ()
(define-key dired-mode-map (kbd "M-w") 'dired-ranger-copy)
(define-key dired-mode-map (kbd "C-y") 'dired-ranger-paste)
(define-key dired-mode-map (kbd "C-c C-y") 'dired-ranger-move))))
PS: Wenn es keine :defer
, :commands
, :mode
und andere , die Paketlade faul macht, dann :init
und :config
die mehr oder weniger gleich sein sollten (aber :init
wird früher ausgewertet werden :))
:config
ist zu spät - beim faulen Laden werden meine Bindungen nicht übernommen. Und :bind
mit :map
bindet es eigentlich nicht.
:config
es ist nicht zu spät - genau dann dired-mode-map
wird erst definiert. Sie setzen es wahrscheinlich nur in die falsche use-package
Form dired-ranger
anstatt dired
, wo dired-mode-map
es definiert ist. Dies könnte auch erklären, warum Ihr :bind
nicht funktioniert. Grundsätzlich machst du entweder etwas falsch oder hast use-package
einen Bug. Verwechseln Sie lokale Tastaturbelegungen nicht eval-after-load
mit globalen Tastaturbelegungen von automatisch geladenen Befehlen / Tastaturbelegungen.
use-package-always-ensure
und wenn ich versuche, -package dired zu verwenden, schlägt es fehl, es von elpa abzurufen. Aber :ensure nil
dort zu haben, löst das Problem und ich kann verkettetes Laden von Paketen einrichten dired
-> dired-ranger
mit :after
.
:bind
Schlüsselwort verwenden oder die Tastenkombinationen im:config
Block ändern .