Czy jest jakaś reguła, według której użytkownik może ustalić, czy konfiguracja pakietu wymaga, :init
czy :config
?
źródło
Czy jest jakaś reguła, według której użytkownik może ustalić, czy konfiguracja pakietu wymaga, :init
czy :config
?
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 :))
:bind
do tego słowa kluczowego lub zmodyfikować przypisania klawiszy w:config
bloku.: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 wtedydired-mode-map
jest definiowany. Prawdopodobnie po prostu umieszczasz go w złejuse-package
formiedired-ranger
zamiastdired
, gdziedired-mode-map
jest zdefiniowane. To może również wyjaśniać, dlaczego twój:bind
nie działa. Zasadniczo albo robisz coś źle, albo maszuse-package
błąd. Nie należy mylić lokalnych skrótów klawiszowych ieval-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ńcuchydired
->dired-ranger
za pomocą:after
.