Ответы:
Есть ли какое-либо правило, по которому пользователь может определить, требуется ли конфигурация пакета
:init
или:config
?
Нет общего правила, которое применяется ко всем настройкам и пакетам; вам просто необходимо ознакомиться со смыслом этих слов, прочитав файл README из use-package
.
Таким образом, :init
блок запускается при запуске, как если бы вы поместили составляющие его формы на верхнем уровне (то есть вне типичного вызова use-package
) вашего user-init-file
. Это означает, что они всегда запускаются независимо от того, был ли загружен соответствующий пакет или нет.
:config
Блока, с другой стороны, выполняется после того, как был загружен соответствующий пакет, посредством этого eval-after-load
механизма.
Таким образом, вы можете улучшить время запуска, переместив соответствующие длительные настройки из :init
в :config
. Если вам нужно изменить переменную, которая определяется только после загрузки определенного пакета, вам также необходимо поместить ее в :config
блок. Некоторые переменные, такие как gnus-home-directory
, должны быть установлены до загрузки соответствующего пакета, поэтому они должны быть помещены в :init
. Я настоятельно рекомендую поместить все применимые add-hook
/ remove-hook
вызовы в :init
блок, так как хуки могут быть изменены, даже когда они не связаны, и это дает больше модульности вашей установке.
Вы часто можете избежать определения места установки определенного параметра, используя новое :custom
ключевое слово или напрямую используя интерфейс Easy Customization .
Я не уверен, есть ли общее правило (кроме «использовать :init
для предварительной конфигурации перед фактической загрузкой пакета и использовать :config
для другой, ну, в общем , конфигурации»).
Но я для себя использую, :init
когда, например, я хочу добавить некоторые другие сочетания клавиш карты режимов, чтобы использовать функции из этого пакета. И все же хочу, чтобы этот пакет был загружен.
Вот пример ленивой загрузки 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: Если нет :defer
, :commands
, :mode
и других , что делает пакет загрузку ленивым, то :init
и :config
должно быть более или менее то же самое (но :init
будет оцениваться раньше :))
:config
уже поздно - ленивая загрузка не применит мои привязки. И :bind
с :map
фактически не связывает это.
:config
еще не поздно - это именно то, когда dired-mode-map
это впервые определено. Вы, вероятно, просто помещаете это в неправильную use-package
форму dired-ranger
вместо того dired
, где dired-mode-map
определено. Это также может объяснить, почему ваш :bind
не работает. В основном, вы делаете что-то не так или имеете use-package
ошибку. Не путайте локальные привязки клавиш и eval-after-load
глобальные привязки автоматически загружаемых команд / сопоставлений клавиш.
use-package-always-ensure
и когда я пытаюсь использовать-package dired, он не может получить его из elpa. Но наличие :ensure nil
там решает проблему, и я могу настроить загрузку цепочки dired
-> dired-ranger
использование :after
.
:bind
ключевое слово или изменить привязки клавиш в:config
блоке.