use-package -: init або: config


14

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

Відповіді:


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, thx, ти маєш рацію. Моя проблема полягала в тому, що я встановив, use-package-always-ensureі коли я намагаюся використовувати перероблений пакет, він не вдається отримати його з elpa. Але, маючи :ensure nilтам, вирішує проблему, і я можу налаштувати ланцюгове завантаження пакунків dired-> dired-rangerза допомогою :after.
Максим Кім
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.