TL; DR:
Додайте наступний рядок у верхню частину файлу init ( .emacs.d/init.el
або .emacs
):
(package-initialize)
Пояснення
Створення більшої кількості файлів, які Emacs може використовувати в якості user-init-file
, безумовно, не є правильним підходом. Оскільки в посібнику не сказано, що є кращим у випадку виникнення конфлікту, принаймні, не в тій частині, яку ви цитували, все це вводить плутанину - тепер ми не знаємо, що насправді є user-init-file
(чию цінність ви могли б хотіти оглянути, щоб дізнатися).
Тож почніть з видалення всіх кандидатів, за винятком тих, ~/.emacs.d/init.el
що, як правило, бажано (користувачами), оскільки це не сприяє нечестивому безладу, $HOME
і це дозволяє зберігати всі файли конфігурації Emacs, включаючи найважливіший, під контролем версій, використовуючи сховище тільки для Emacs
За замовчуванням Emacs дзвонить package-initialize
після завантаження файлу init користувача. Він робить це на всіх , тому що в наш час більшість користувачів встановлюють свої пакети з допомогою package.el
- тому вони не повинні робити нічого , щоб ці пакети повинні бути доступні.
З іншого боку , НЕ все робить, так що це повинно бути можливо НЕ назвати package-initialize
. Запобігання виклику цієї функції здійснюється шляхом додавання (setq package-enable-at-startup nil)
до файлу init користувача (куди б ви його могли розмістити?).
package-initialize
не можна викликати, перш ніж користувач змінив, щоб сказати Emacs не робити цього, і це потрібно зробити після завантаження файлу init. Поки користувач встановлює лише пакети, а потім використовує їх як є або налаштовує їх за допомогою користувальницького інтерфейсу, який працює чудово. Але якщо ви хочете налаштувати ваші пакунки за допомогою elisp, тоді вам доведеться переконатися, що вони фактично перебувають load-path
раніше, ніж використовувати функції, які вони визначають.
Це досить легко зробити і правильно задокументувати (якби я переглянув це в першу чергу, мені б не довелося писати більшість із зазначеного вище: - /
Причина автоматичного завантаження пакета після завантаження файлу init полягає в тому, що користувацькі параметри отримують свої індивідуальні значення лише після завантаження файлу init, включаючи параметри користувача, які впливають на систему упаковки. За певних обставин, можливо, ви захочете явно завантажити пакунки у свій файл init (як правило, тому, що якийсь інший код у вашому файлі init залежить від пакета). У цьому випадку ваш файл init повинен викликати функцію package-initialize
. Ви повинні переконатися, що відповідні параметри користувача, наприклад package-load-list
(див. Нижче), будуть встановлені перед package-initialize
викликом. Ви повинні також встановити
package-enable-at-startup
вnil
, щоб уникнути завантаження пакетів після обробки файлу init. Крім того, ви можете повністю призупинити завантаження пакета при запуску та застосувати команду `Mx package-Initialize ', щоб завантажити ваші пакунки вручну.
Так:
;;; .emacs.d/init.el -- the `user-init-file'
(package-initialize)
(setq package-enable-at-startup nil)
(require 'use-package)
(use-package some-package
:init (setq some-package-variable "foobar")
...
;;; .emacs.d/init.el ends here
Звичайно, проблема (або додаткова проблема) також може полягати в тому, що помилка друку Symbol's function definition is void: use-packge
є у вашому файлі init, і вона не сталася, поки ви не ввели її в emacs.se.