Odpowiedzi:
Czy jest jakaś reguła, według której użytkownik może ustalić, czy konfiguracja pakietu wymaga,
:init
czy: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, :init
blok 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 :config
drugiej strony blok jest uruchamiany po załadowaniu odpowiedniego pakietu za pomocą eval-after-load
mechanizmu.
W związku z tym możesz poprawić czas uruchamiania, przenosząc odpowiednie ustawienia długoterminowe z :init
na :config
. Jeśli potrzebujesz zmodyfikować zmienną, która jest zdefiniowana dopiero po załadowaniu konkretnego pakietu, podobnie musisz umieścić ją w :config
bloku. 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-hook
połączenia w :init
bloku, 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 :custom
słowa kluczowego lub bezpośrednio korzystając z interfejsu łatwej personalizacji .
Nie jestem pewien, czy istnieje ogólna zasada (oprócz „użycia :init
do wstępnej konfiguracji przed faktycznym załadowaniem pakietu i użycia :config
do innej, no, konfiguracji”).
Ale dla siebie używam, :init
gdy 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
, :mode
i inne, które sprawia, że pakiet załadunku leniwy, to :init
i :config
powinny być mniej więcej takie same (ale :init
będą oceniane wcześniej :))
:config
jest już za późno - leniwe ładowanie nie zastosuje moich powiązań. I :bind
z :map
tak naprawdę tego nie wiąże.
:config
nie jest za późno - dokładnie wtedy dired-mode-map
jest definiowany. Prawdopodobnie po prostu umieszczasz go w złej use-package
formie dired-ranger
zamiast dired
, gdzie dired-mode-map
jest zdefiniowane. To może również wyjaśniać, dlaczego twój :bind
nie działa. Zasadniczo albo robisz coś źle, albo masz use-package
błąd. Nie należy mylić lokalnych skrótów klawiszowych i eval-after-load
globalnych skrótów automatycznie ładowanych poleceń / map klawiszy.
use-package-always-ensure
a kiedy próbuję użyć pakietu dired, nie można pobrać go z ELPA. Ale :ensure nil
rozwiązanie tego problemu rozwiązuje problem i mogę skonfigurować ładowanie pakietu w łańcuchy dired
-> dired-ranger
za pomocą :after
.
:bind
do tego słowa kluczowego lub zmodyfikować przypisania klawiszy w:config
bloku.