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.