use-package -: init lub: config

14

Czy jest jakaś reguła, według której użytkownik może ustalić, czy konfiguracja pakietu wymaga, :initczy :config?

rchar01
źródło

Odpowiedzi:

13

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 .

Bazylia
źródło
2

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 :))

Maxim Kim
źródło
4
Modyfikacja powiązań klawiszy w zaczepie trybu oznacza, że ​​są one uruchamiane za każdym razem , gdy otwierasz bufor w tym trybie. Wystarczy zmodyfikować powiązania klawiszy tylko raz, po załadowaniu pakietu. Możesz użyć :binddo tego słowa kluczowego lub zmodyfikować przypisania klawiszy w :configbloku.
Basil
Rzeczywiście, nigdy o tym nie myślałem. Ale :configjest już za późno - leniwe ładowanie nie zastosuje moich powiązań. I :bindz :maptak naprawdę tego nie wiąże.
Maxim Kim
3
: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.
Basil
@Basil, dzięki, masz rację. Mój problem polegał na tym, że ustawiłem, 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.
Maxim Kim