Różnią się, jeśli pakiet jest odroczony, tzn. Nie jest ładowany, dopóki nie będzie potrzebny. W takim przypadku :init
zostanie wykonany w momencie pierwszego odczytu pliku emacs, ale :config
zostanie wykonany w momencie załadowania pakietu.
W twoim przykładzie użycie mode
niejawnie odkłada ładowanie pakietu. Skonfigurowałeś pakiet do ładowania przy pierwszej wizycie na pliku HTML.
Możesz użyć, :demand
aby upewnić się, że pakiet jest zawsze ładowany przy starcie, ale bardziej prawdopodobne jest, że chcesz to zrobić :init
.
Z dokumentacji:
:init Code to run when `use-package' form evals.
Ponieważ umieszczasz to w pliku inicjującym użytkownika, oznacza to w zasadzie, że uruchomi się przy starcie.
:config Runs if and when package loads.
Nie uruchamiaj, dopóki pakiet nie zostanie załadowany.
:defer Defer loading of package -- automatic if :commands, :bind, :bind*, :mode or :interpreter are used.
Zwróć uwagę na listę rzeczy, które automatycznie powodują odroczenie pakietu. Zasadniczo, jeśli podasz use-package
warunki, w których potrzebujesz tego pakietu, oznacza to, że nie chcesz go ładować, dopóki te warunki nie wystąpią.
:demand Prevent deferred loading in all cases.
Upewnij się, że pakiet jest ładowany podczas uruchamiania, niezależnie od innych opcji, które określiłeś.
Aktualizacja
Powtórzenie tego w oparciu o ostatnie komentarze ... To, co powiedziałem powyżej, jest prawdą, ale nie sądzę, że poprawnie odpowiada na pytanie. Głównym problemem tutaj jest to, że html-mode
nie jest to pakiet, ale tryb zdefiniowany przez pakiet sgml-mode
. Działa to zgodnie z oczekiwaniami:
(use-package sgml-mode
:mode ("\\.html\\'" . html-mode)
:config (add-hook 'html-mode-hook 'turn-off-auto-fill))
W oryginalnym przykładzie :config
wyrażenie nigdy nie jest oceniane, ponieważ pakiet o nazwie html-mode
nigdy nie jest ładowany. Przeniesienie tego samego wyrażenia do :init
działa, ponieważ kod inicjujący jest zawsze analizowany, niezależnie od tego, czy pakiet kiedykolwiek zostanie załadowany.
:idle
dość szeroko i nie analizowałem wpływu „: bezczynność została usunięta”.auto-fill
nie jest wyłączony, tzn. Kod konfiguracji nie został uruchomiony. Mam ten sam problem.html-mode
nie jest to pakiet. Przynajmniej w mojej obecnej wersji Emacsahtml-mode
jest zdefiniowany w pakieciesgml-mode
. Jeśli więc powieszuse-package
coś zrobić, gdyhtml-mode
załadowany zostanie pakiet o nazwie , kod nigdy nie zostanie uruchomiony, ponieważ żaden taki pakiet nigdy nie jest ładowany. Musisz umieścić konfigurację trybu HTML w pliku(use-package sgml-mode ....)
.org-mode
, niehtml-mode
. Podobnym problemem jest to, że pakiet jest wywoływanyorg-mode
, ale pakiet ELPA jest wywoływanyorg
. Może to jest mylące (lub ja)?Ten przykład bardzo ułatwił mi zrozumienie różnicy między
:init
i:config
. Weźmy przykładace-window
pakietu (ale może to być dowolny pakiet). Umieść to w swoiminit.el
pliku:Teraz otwórz emacsa i sprawdź w
*Messages*
buforze, czy jest tam jakaśhello world
wiadomość. Nie będzie można go znaleźć, ponieważ pakiet jest odroczony. Teraz zmień zconfig
nainit
:Teraz zamknij i ponownie otwórz emacsa i sprawdź
*Messages*
bufor. Zobaczysz komunikat,ace window: hello world
ponieważ kod jest uruchamiany bez względu na to, kiedy:init
zostanie podany. W takim przypadkuconfig
będzie uruchamiany tylko po załadowaniu tego pakietu.źródło
:init
a:preface
twoim przykładem?:preface
jest uruchamiany, nawet jeśli dany pakiet jest wyłączony, natomiast:init
jest uruchamiany tylko wtedy, gdy pakiet jest włączony.