use-package -: init или: config

14

Есть ли какое-либо правило, по которому пользователь может определить, требуется ли конфигурация пакета :initили :config?

rchar01
источник

Ответы:

13

Есть ли какое-либо правило, по которому пользователь может определить, требуется ли конфигурация пакета :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 .

Бэзил
источник
2

Я не уверен, есть ли общее правило (кроме «использовать :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будет оцениваться раньше :))

Максим Ким
источник
4
Изменение привязок клавиш в хуке режима означает, что они запускаются каждый раз, когда вы открываете буфер в этом режиме. Вам нужно всего лишь один раз изменить привязки клавиш после загрузки пакета. Для этого вы можете использовать :bindключевое слово или изменить привязки клавиш в :configблоке.
Василий
Действительно, никогда не думал об этом. Но :configуже поздно - ленивая загрузка не применит мои привязки. И :bindс :mapфактически не связывает это.
Максим Ким
3
:configеще не поздно - это именно то, когда dired-mode-mapэто впервые определено. Вы, вероятно, просто помещаете это в неправильную use-packageформу dired-rangerвместо того dired, где dired-mode-mapопределено. Это также может объяснить, почему ваш :bindне работает. В основном, вы делаете что-то не так или имеете use-packageошибку. Не путайте локальные привязки клавиш и eval-after-loadглобальные привязки автоматически загружаемых команд / сопоставлений клавиш.
Василий
@Basil, спасибо, ты прав. Моя проблема была в том, что я установил, use-package-always-ensureи когда я пытаюсь использовать-package dired, он не может получить его из elpa. Но наличие :ensure nilтам решает проблему, и я могу настроить загрузку цепочки dired-> dired-rangerиспользование :after.
Максим Ким