Я использую package
для управления своими расширениями Emacs. Чтобы синхронизировать мои настройки Emacs на разных компьютерах, я бы хотел указать список имен пакетов в .emacs
файле, а затем package
мог бы автоматически искать и устанавливать пакеты, так что мне не нужно устанавливать их вручную, вызывая M-x package-list-packages
. Как это сделать?
123
Ответы:
источник
package
.package-refresh-contents
, запустится, только если пакет не установлен? Как(or (file-exists-p package-user-dir))
лучше / как проверить, установлены ли пакеты?package-refresh-contents
. Вероятно, это будет запущено только при первом открытии emacs на новом компьютере, и меня это устраивает. Если пакет требует обновления, это можно сделать вручную.use-package
, вы можете использовать:ensure
ключевое слово для автоматической установки пакетов. Это также настраивает,package-selected-packages
если вам нужно получить доступ к списку пакетов через настройку или программно.На основе комментариев Profpatsch и ответов ниже:
источник
or
? Ух ты.mapc
это по побочным эффектам. Но почему бы не использоватьunless
?(package-initialize)
перед ссылкой наpackage-user-dir
Emacs 25.1+ будет автоматически отслеживать пакеты, установленные пользователем, в настраиваемой
package-selected-packages
переменной.package-install
обновит переменную настройки, и вы сможете установить все выбранные пакеты с помощьюpackage-install-selected-packages
функции.Еще одно удобное преимущество этого подхода заключается в том, что вы можете использовать его
package-autoremove
для автоматического удаления пакетов, которые не включеныpackage-selected-packages
(хотя при этом сохранятся зависимости).Источник: http://endlessparentheses.com/new-in-package-el-in-emacs-25-1-user-selected-packages.html
источник
Вот код, который я использую для Emacs Prelude :
Если вы не используете MELPA, вам не нужно его требовать (а если вы это сделаете,
melpa.el
он должен быть на вашемload-path
(или установлен через MELPA). Db пакета не обновляется каждый раз (так как это значительно замедлит запуск) ) - только там, где есть неустановленные пакеты.источник
Еще никто не упомянул Cask , но он вполне подходит для этой задачи.
По сути, вы создаете
~/.emacs.d/Cask
список пакетов, которые хотите установить. Например:При запуске
cask
из командной строки эти пакеты и все необходимые им зависимости будут установлены.Также вы можете автоматически обновлять установленные пакеты с помощью
cask update
.источник
/path/to/emacs -Q --script /path/to/cask/cask-cli.el -- [args]
Вызовите
package-install
с именем пакета в виде символа. Вы можете найти имена пакетов для своих пакетов, позвонив вpackage-install
интерактивном режиме и введя имя. Функцияpackage-installed-p
сообщит вам, если он уже установлен.Например:
источник
error: Package
dired + 'недоступен для установки'. dired + - это пакет, который я пробовал использовать с вашим кодом.dired+
, когда вы бежитеpackage-list-packages
? Я считаю, что вам нужно добавить в свой мармелад или мелпуpackage-archives
. Если да, можешь ли ты бежать(package-install 'dired+)
?(package-installed-p 'dired+)
должен вернуться,t
и он будет пропущен в приведенном выше коде.package-installed-p
только код работает нормально, а весь блок кода - нет. Пробовал несколько пакетов.источник
Мне нравится проверять, хочет ли пользователь сначала установить пакеты, как это сделано в этом ответе . Также я обновляю содержимое своего пакета один раз перед установкой. Я не уверен, что это лучший способ, но я не думаю, что лучшие ответы помогли мне.
источник
Я столкнулся с проблемой , что ничего не произошло после добавления
(package-install 'org)
в.emacs
. Я хотел установить последнюю версиюorg-mode
и встроенныйorg-mode
довольно старая.Я откопал исходный код
package-install
из Emacs 25.3.1. Функция self уже проверяет, установлен ли пакет или нет, и отказывается установить его, если пакет уже установлен. Так что проверка(unless (package-installed-p package) ...)
из ответа 10093312 фактически не требуется.Встроенный
org-mode
также считается установленным иpackage-install
отказывается устанавливать более новую версию от ELPA. Потратив некоторое время на чтение package.el, я пришел к следующему решению.Причина, по которой это работает, заключается в том, что
package-*
функции семейства обрабатывают аргументы по-разному в зависимости от того, является ли это символ илиpackage-desc
объект. Вы можете указать информацию о версии толькоpackage-install
черезpackage-desc
объект.источник
Вот мой, он короче :)
источник
Вот еще способ.
источник