В Emacs дополнения распространяются в виде пакетов — одного или нескольких файлов с кодом на языке Emacs Lisp.
Существует несколько способов установки пакетов, но самый распространённый — использование специальных хранилищ, которые называются архивами пакетов.
Основные архивы
Архивов пакетов много, а я один, поэтому расскажу только про самые важные:
-
MELPA — очень много пакетов, но собираются они из последнего коммита в репозитории соответствующего проекта.
Это значит, что качество большинства пакетов в MELPA ниже плинтуса. Обычное дело, когда после обновления пакет вдруг перестаёт работать.
-
MELPA Stable — та же MELPA, только пакеты собираются из ревизий кода, отмеченных тегами.
Это не гарантирует стабильность пакетов. Хотя в среднем ситуация лучше чем в MELPA.
-
GNU ELPA — архив стабильных пакетов, сопровождаемых разработчиками проекта GNU.
В этом архиве из-за лицензионных или иных соображений нет многих пакетов. Часть пакетов — очень старых версий. Однако, каждый пакет, размещённый здесь, стабилизирован, протестирован и имеет хорошую документацию.
В современных версиях Emacs этот архив доступен по умолчанию.
-
NonGNU ELPA — архив стабильных пакетов, управляемый проектом GNU.
Пакеты в этом архиве не сопровождаются разработчиками проекта GNU. В целом, качество пакетов очень высокое. Можно ставить и обновлять без опасений, что сломается конфигурация.
Настройка архивов
Настройка архивов выполняется следующим образом:
(with-eval-after-load 'package
(add-to-list 'package-archives '("gnu" . "https://elpa.gnu.org/packages/") t)
(add-to-list 'package-archives '("nongnu" . https://elpa.nongnu.org/nongnu/) t))
(package-initialize)
Архивы MELPA и MELPA Stable я не добавил сознательно. Трижды подумайте, прежде чем сделать это!
Укажем какой архив считать более приоритетным, если один и тот же пакет будет доступен в обоих архивах:
(setopt package-archive-priorities ;; Приоритеты архивов: чем выше, тем лучше.
'(("gnu" . 2)
("nongnu" . 1)))
Проверим, имеется ли локальная копия индекса архивов. Если её нет, загрузим её:
(unless (package-archive-contents)
(package-refresh-contents))
Проверим наличие пакета use-package. Установим его в случае отсутствия:
(unless (package-installed-p 'use-package)
(package-install 'use-package t))
Если пакет use-package встроенный, обновим его из архивов:
(unless (alist-get 'use-package package-alist)
(package-upgrade 'use-package))