use-package -: init oder: config

13

Gibt es eine Regel, nach der der Benutzer bestimmen kann, ob die Paketkonfiguration dies erfordert :initoder nicht :config?

rchar01
quelle

Antworten:

13

Gibt es eine Regel, nach der der Benutzer bestimmen kann, ob die Paketkonfiguration dies erfordert :initoder 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 :initBlock 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 :configBlock hingegen wird nach dem Laden des entsprechenden Pakets über den eval-after-loadMechanismus ausgeführt.

Auf diese Weise können Sie die Startzeit verbessern, indem Sie die entsprechenden Einstellungen für lange Laufzeiten von :initnach 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 :configBlock 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-hookAufrufe in den :initBlock 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 :customSchlüsselwort oder die Benutzeroberfläche für die einfache Anpassung direkt verwenden.

Basilikum
quelle
2

Ich bin nicht sicher, ob es eine allgemeine Regel gibt (abgesehen von "Verwendung :initzur Vorkonfiguration vor dem eigentlichen Laden des Pakets und Verwendung :configfür andere Konfigurationen").

Ich selbst verwende es :initjedoch, 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, :modeund andere , die Paketlade faul macht, dann :initund :configdie mehr oder weniger gleich sein sollten (aber :initwird früher ausgewertet werden :))

Maxim Kim
quelle
4
Das Ändern von Tastenkombinationen in einem Modus-Hook bedeutet, dass sie jedes Mal ausgeführt werden, wenn Sie in diesem Modus einen Puffer öffnen. Sie müssen die Tastenkombinationen nur einmal ändern, nachdem das Paket geladen wurde. Sie können hierfür das :bindSchlüsselwort verwenden oder die Tastenkombinationen im :configBlock ändern .
Basil
In der Tat nie darüber nachgedacht. Aber es :configist zu spät - beim faulen Laden werden meine Bindungen nicht übernommen. Und :bindmit :mapbindet es eigentlich nicht.
Maxim Kim
3
:configes ist nicht zu spät - genau dann dired-mode-mapwird erst definiert. Sie setzen es wahrscheinlich nur in die falsche use-packageForm dired-rangeranstatt dired, wo dired-mode-mapes definiert ist. Dies könnte auch erklären, warum Ihr :bindnicht funktioniert. Grundsätzlich machst du entweder etwas falsch oder hast use-packageeinen Bug. Verwechseln Sie lokale Tastaturbelegungen nicht eval-after-loadmit globalen Tastaturbelegungen von automatisch geladenen Befehlen / Tastaturbelegungen.
Basil
@Basil, danke, du hast recht. Mein Problem war, dass ich gesetzt habe use-package-always-ensureund wenn ich versuche, -package dired zu verwenden, schlägt es fehl, es von elpa abzurufen. Aber :ensure nildort zu haben, löst das Problem und ich kann verkettetes Laden von Paketen einrichten dired-> dired-rangermit :after.
Maxim Kim