Архивы пакетов GNU Emacs

Что такое архивы и как с ними работать.

В 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))
Создано при помощи Hugo
Тема Stack, дизайн Jimmy