Вони різні, якщо пакет відкладений, тобто не завантажений, поки це не потрібно. У цьому випадку :init
він буде виконаний під час першого читання файлу emacs, але :config
він буде виконуватися під час фактичного завантаження пакета.
У вашому прикладі використання mode
неявно відкладає завантаження пакету. Ви налаштували пакет для завантаження при першому відвідуванні HTML-файлу.
Ви можете використати :demand
для того, щоб переконатися, що пакет завжди завантажений під час запуску, але більш імовірно, що ви хочете тут зробити, це надіти свій гачок :init
.
З докстрингу:
:init Code to run when `use-package' form evals.
Оскільки ви поміщаєте це у свій файл-init, це в основному означає, що воно запуститься при запуску.
:config Runs if and when package loads.
Отже, не запускайте, поки пакет фактично не завантажується ..
:defer Defer loading of package -- automatic if :commands, :bind, :bind*, :mode or :interpreter are used.
Зауважте список речей, які автоматично відкладають пакет. В основному, якщо ви повідомляєте use-package
умови, в яких вам потрібен цей пакет, він передбачає, що ви не хочете завантажувати його, поки ці умови не виникнуть.
:demand Prevent deferred loading in all cases.
Переконайтеся, що пакет завантажений під час запуску, незалежно від того, які інші опції ви вказали.
Оновлення
Переглянувши це, грунтуючись на останніх коментарях ... Те, що я сказав вище, все правда, але я не думаю, що це правильно відповідає на питання. Основна проблема тут насправді в тому, що html-mode
це не пакет, а скоріше режим, визначений пакетом sgml-mode
. Це працює так, як очікувалося для мене:
(use-package sgml-mode
:mode ("\\.html\\'" . html-mode)
:config (add-hook 'html-mode-hook 'turn-off-auto-fill))
У оригінальному прикладі :config
вираз ніколи не оцінюється, оскільки пакет з назвою html-mode
ніколи не завантажується. Переміщення того ж виразу на :init
роботу, тому що код init завжди оцінюється, незалежно від того, чи завантажується пакет.