Они отличаются, если пакет откладывается, т.е. не загружается до тех пор, пока он не понадобится. В этом случае :init
он будет выполнен во время первого чтения вашего файла emacs, но :config
будет выполнен во время фактической загрузки пакета.
В вашем примере использование mode
неявно откладывает загрузку пакета. Вы настроили пакет для загрузки при первом посещении html-файла.
Вы можете использовать :demand
это, чтобы убедиться, что пакет всегда загружается при запуске, но более вероятно, что вы хотите сделать здесь, это вставить свой крючок :init
.
Из строки документации:
:init Code to run when `use-package' form evals.
Поскольку вы помещаете это в свой пользовательский файл инициализации, это в основном означает, что он будет запускаться при запуске.
: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
рабочее состояние, потому что код инициализации всегда вычисляется независимо от того, был ли загружен пакет.
:idle
довольно широко и не изучал влияние ": холостой ход был удален".auto-fill
не выключается, т.е. код конфигурации не запускается. У меня точно такая же проблема.html-mode
это не пакет. По крайней мере, в моей текущей версии Emacs,html-mode
это определено в пакетеsgml-mode
. Поэтому, если вы скажетеuse-package
что-то делать, когдаhtml-mode
загружен пакет с именем, этот код никогда не запускается, потому что такой пакет никогда не загружается. Вам нужно поместить настройку html-режима в(use-package sgml-mode ....)
.org-mode
, а неhtml-mode
. Аналогичная проблема заключается в том, что пакет вызываетсяorg-mode
, но вызывается пакет ELPAorg
. Может это смущает (или меня)?Этот пример помог мне понять разницу между
:init
и:config
. Давайте рассмотрим примерace-window
пакета (но это может быть любой пакет). Поместите это в свойinit.el
файл:Теперь откройте свой emacs и посмотрите в
*Messages*
буфере, чтобы увидеть, есть ли какое-либоhello world
сообщение. Вы не сможете найти их, потому что пакет отложен. Теперь измените сconfig
наinit
:Теперь закройте и снова откройте emacs и осмотрите
*Messages*
буфер. Вы увидите сообщение,ace window: hello world
потому что код запускается независимо от того, когда:init
он задан. В случае этогоconfig
он будет запущен только тогда, когда этот пакет загружен.источник
:init
и:preface
на основе вашего примера?:preface
запускается, даже если данный пакет отключен, тогда как:init
запускается только при включенном пакете.