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