После недавнего изучения use-package
я решил портировать свою конфигурацию на него, но обнаружил, что не хочу отказываться от удобства использования package.el
для установки пакетов и их обновления. Я нашел это немного сложным для объединения use-package
и package.el
.
Мне, как правило, интересно узнать, как люди объединяются use-package
с package.el
системой, но для более конкретного вопроса продолжайте читать.
Вот что я хочу:
- Чтобы пакеты были установлены менеджером пакетов, чтобы я мог легко просматривать пакеты и постоянно обновлять их
list-packages
. - Настраивать и загружать пакеты исключительно через
use-package
, чтобы я мог легко видеть в моем файле инициализации, что именно я загружаю и как он настроен. - По желанию, я хотел бы также иметь возможность установить пакеты через
use-package
«s:ensure
ключевое слово.
Если я правильно понимаю, я хочу очень мало того, что package-initialize
делает, в основном только то, как это настраивает load-path
. В настоящее время у меня есть это в моей конфигурации:
;(package-initialize)
(setq package-enable-at-startup nil)
(let ((default-directory "~/.emacs.d/elpa"))
(normal-top-level-add-subdirs-to-load-path))
(require 'use-package)
Первая закомментированная строка такова, что Emacs 25 не добавляет (package-initialize)
в мой файл инициализации. Бит с normal-top-level-add-subdirs-to-load-path
является приближением к тому, package-initialize
что сделало бы load-path
, приближение, которое кажется достаточно хорошим.
Это, кажется, достигает моих желаний 1 и 2, но не 3. Если я пытаюсь использовать :ensure
, я получаю сообщение об ошибке, говорящее, что package.el
это не инициализировано. Вызов исправил package-initialize
бы это, но я хотел бы избежать этого, так как а) я не хочу, чтобы загружались все бесчисленные автозагрузки (я предпочитаю использовать use-package
для создания именно тех автозагрузок, которые мне нужны), и б) я хочу иметь возможность легко Старайтесь не загружать определенные установленные пакеты в любое время (это легко сделать use-package
).
У кого-нибудь есть рекомендации как это сделать?
источник
package-initialize
которое делает мой вопрос спорным.С вашей текущей конфигурацией вы фактически отключили package.el, поскольку вы не инициализируете менеджер пакетов и не препятствуете его автоматической инициализации в Emacs. Все, что вы делаете в ответ, - это добавление ELPA в
load-path
, но это лишь небольшая часть того, что делает package.el. Я не уверен, почему вы это делаете, но я не рекомендую эту настройку.В частности, вы не получите автозагрузку пакетов с вашим подходом, что означает, что изначально никакие команды из любого пакета не будут доступны.
Другими словами, вам
M-x
предложат только встроенные команды. Чтобы добавить в командах из пакетов , которые вы должны были бы добавить явные:commands
определения для всех вашихuse-package
заявлений, что составляет к многим поддерживающего усилию, особенно для больших пакетов , таких как Magit-за практически равен нуль коэффициент усиления package.el дает автозагрузки бесплатно ,Объединение
use-package
с package.el на самом деле очень просто - вся установка основана на этой комбинации - но гораздо лучше позволить package.el фактически выполнить свою работу. Просто инициализируйте package.el в самом начале вашего файла инициализации:Для удобства вы можете впоследствии начать загрузку
use-package
, если она еще не установлена:Это позволит вам начать сеанс Emacs на новой системе, и ваш init.el будет автоматически установлен
use-package
.В конечном итоге вам нужно загрузить
use-package
:Теперь вы можете использовать
use-package
для установки и настройки пакетов:Когда Emacs теперь оценивает эту форму во время запуска,
use-package
проверит, установлен ли Magit, и автоматически установит ее при необходимости.источник
package-initialize
требуется некоторое время, чтобы заполнить путь, определить автозагрузку и сделать все остальное. Мне кажется, я где-то читал, что сам Джон Уигли (авторuse-package
) предпочитает объявлять все автоматически загружаемые команды вuse-package
строфах, а не полагаться на нихpackage.el
.load-path
и добавить автозагрузку в любом случае, черезuse-package
или черезpackage.el
. Я сомневаюсь, что есть ощутимая разница, особенно если у вас современная система с быстрым диском.package-initialize
чем в пользовательском спискеload-path
. Я приписываю это «исследованию» файловой системыpackage.el
. Однако я никогда не измерял сколько-нибудь существенных различий в производительности между загрузкойautoload
определений из файлов и их размещением вuse-package
строфах.package.el
систему, я бы сказал , что я только инвалидpackage-initialize
! Причина в том, что, хотя мне нравитсяlist-packages
искать новые пакеты и специально обновлять все мои установленные в настоящее время пакеты, я думаю, что я предпочитаю целевую загрузкуuse-package
. Для меня автозагрузки только для команд, я использую звуки, как хорошая вещь!