TL; DR:
Добавьте следующую строку в начало вашего файла инициализации ( .emacs.d/init.el
или .emacs
):
(package-initialize)
Объяснение
Создание большего количества файлов, которые Emacs может использовать как user-init-file
определенно, не является правильным подходом. Поскольку в руководстве не сказано, что предпочтительнее в случае возникновения конфликта, по крайней мере, не в той части, которую вы цитировали, все, что нужно сделать, это добавить путаницу - теперь мы не знаем, что на самом деле является user-init-file
(чье значение вы могли бы хотеть осмотреть, чтобы выяснить).
Итак, начните с удаления всех кандидатов, кроме тех, ~/.emacs.d/init.el
которые обычно предпочитаются (пользователями), потому что это не способствует возникновению нечестивого беспорядка $HOME
и позволяет хранить все файлы конфигурации Emacs, включая самый важный, под контролем версий, используя репозиторий только для Emacs.
По умолчанию Emacs вызывает package-initialize
после загрузки файла инициализации пользователя. Он делает это на всех , потому что в наше время большинство пользователей устанавливают свои пакеты с помощью package.el
- поэтому они не должны делать ничего , чтобы эти пакеты должны быть доступны.
С другой стороны, это делают не все , поэтому можно не звонить package-initialize
. Предотвращение вызова этой функции осуществляется путем добавления (setq package-enable-at-startup nil)
в файл инициализации пользователя (где еще вы можете поместить его?).
package-initialize
не может быть вызвано до того, как у пользователя было изменение, чтобы сказать Emacs не делать этого, и это должно быть сделано после загрузки файла инициализации. Пока пользователь только устанавливает пакеты, а затем использует их как есть или настраивает их с помощью пользовательского интерфейса, который работает просто отлично. Но если вы хотите настроить свои пакеты, используя elisp, то вам нужно убедиться, что они действительно включены, load-path
прежде чем использовать функции, которые они определяют.
Это довольно легко сделать и правильно задокументировать (если бы я сначала посмотрел это, мне не пришлось бы писать большую часть вышеперечисленного: - /
Причина, по которой автоматическая загрузка пакета происходит после загрузки файла инициализации, заключается в том, что пользовательские параметры получают свои настраиваемые значения только после загрузки файла инициализации, включая пользовательские параметры, которые влияют на систему упаковки. В некоторых случаях вы можете явно загружать пакеты в файл инициализации (обычно потому, что какой-то другой код в файле инициализации зависит от пакета). В этом случае ваш файл инициализации должен вызывать функцию package-initialize
. Вы должны убедиться, что соответствующие параметры пользователя, такие как package-load-list
(см. Ниже), установлены до package-initialize
вызова. Вы должны также установить
package-enable-at-startup
вnil
, чтобы избежать повторной загрузки пакетов после обработки файла инициализации. Или же вы можете полностью запретить загрузку пакетов при запуске и вызвать команду `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
находится в вашем файле инициализации, и ее не было, пока вы не ввели ее в emacs.se.
(require 'use-package)
раньше(package-initialize)
?Я думаю, что
after-init-hook
решение, упомянутое в этом ответе переполнения стека, должно быть упомянуто:Я думал, что это было так, как это должно было быть сделано, но другие ответы предоставляют информацию о других способах сделать это.
источник
Следующее добавляет все каталоги
~/.emacs.d/site-lisp
в путь загрузки, так что вы можете простоrequire
пакет и все готово:источник