Odpowiedzi:
Czy jest jakaś reguła, według której użytkownik może ustalić, czy konfiguracja pakietu wymaga,
:initczy:config?
Nie ma ogólnej zasady, która dotyczy wszystkich ustawień i pakietów; wystarczy zapoznać się ze znaczeniem tych słów czytając plik README z use-package.
Podsumowując, :initblok jest uruchamiany podczas uruchamiania, tak jakbyś umieścił jego elementy składowe na najwyższym poziomie (tj. Poza typowym wywołaniem do use-package) twojego user-init-file. Oznacza to, że są one zawsze uruchamiane, niezależnie od tego, czy odpowiedni pakiet został załadowany, czy nie.
Z :configdrugiej strony blok jest uruchamiany po załadowaniu odpowiedniego pakietu za pomocą eval-after-loadmechanizmu.
W związku z tym możesz poprawić czas uruchamiania, przenosząc odpowiednie ustawienia długoterminowe z :initna :config. Jeśli potrzebujesz zmodyfikować zmienną, która jest zdefiniowana dopiero po załadowaniu konkretnego pakietu, podobnie musisz umieścić ją w :configbloku. Niektóre zmienne, takie jak gnus-home-directory, muszą zostać ustawione przed załadowaniem odpowiadającego im pakietu, więc należy je umieścić :init. Zdecydowanie radzę umieszczać wszystkie odpowiednie połączenia add-hook/ remove-hookpołączenia w :initbloku, ponieważ haki można modyfikować, nawet gdy są one niezwiązane, a to zapewnia większą modułowość konfiguracji.
Często można uniknąć konieczności umieszczenia określonego ustawienia, używając nowego :customsłowa kluczowego lub bezpośrednio korzystając z interfejsu łatwej personalizacji .
Nie jestem pewien, czy istnieje ogólna zasada (oprócz „użycia :initdo wstępnej konfiguracji przed faktycznym załadowaniem pakietu i użycia :configdo innej, no, konfiguracji”).
Ale dla siebie używam, :initgdy na przykład chcę dodać inne skróty klawiszowe mapy trybu, aby korzystać z funkcji z „tego” pakietu. I nadal chcę, aby „ten” pakiet był leniwie ładowany.
Oto przykład leniwego ładowania 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: Jeśli nie ma :defer, :commands, :modei inne, które sprawia, że pakiet załadunku leniwy, to :initi :configpowinny być mniej więcej takie same (ale :initbędą oceniane wcześniej :))
:configjest już za późno - leniwe ładowanie nie zastosuje moich powiązań. I :bindz :maptak naprawdę tego nie wiąże.
:confignie jest za późno - dokładnie wtedy dired-mode-mapjest definiowany. Prawdopodobnie po prostu umieszczasz go w złej use-packageformie dired-rangerzamiast dired, gdzie dired-mode-mapjest zdefiniowane. To może również wyjaśniać, dlaczego twój :bindnie działa. Zasadniczo albo robisz coś źle, albo masz use-packagebłąd. Nie należy mylić lokalnych skrótów klawiszowych i eval-after-loadglobalnych skrótów automatycznie ładowanych poleceń / map klawiszy.
use-package-always-ensurea kiedy próbuję użyć pakietu dired, nie można pobrać go z ELPA. Ale :ensure nilrozwiązanie tego problemu rozwiązuje problem i mogę skonfigurować ładowanie pakietu w łańcuchy dired-> dired-rangerza pomocą :after.
:binddo tego słowa kluczowego lub zmodyfikować przypisania klawiszy w:configbloku.