Відповіді:
Чи є якесь правило, за допомогою якого користувач може визначити, чи потрібна конфігурація пакета
: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
і коли я намагаюся використовувати перероблений пакет, він не вдається отримати його з elpa. Але, маючи :ensure nil
там, вирішує проблему, і я можу налаштувати ланцюгове завантаження пакунків dired
-> dired-ranger
за допомогою :after
.
:bind
для цього ключове слово або змінити прив’язки клавіш до:config
блоку.