Пакет может быть либо простым пакетом, либо многофайловым пакетом. Простой пакет хранится в архивном пакете как один файл Emacs Lisp, в то время как многофайловый пакет хранится как tar-файл (содержащий несколько файлов Lisp и, возможно, не-Lisp файлы, такие как руководство).
В обычном использовании разница между простыми и многофайловыми пакетами не имеет большого значения; интерфейс Меню пакетов не проводит различий между ними. Однако процедура их создания отличается, как объясняется в следующих разделах.
Каждый пакет (будь то простой или многофайловый) имеет определенные атрибуты:
Короткое слово (например, ‘auctex’). Обычно это также префикс символа, используемый в программе (см. Соглашения по кодированию Emacs Lisp).
Номер версии в формате, понятном функции version-to-list (например, ‘11.86’). Каждое издание пакета должно сопровождаться увеличением номера версии, чтобы оно было распознано как обновление пользователями при запросе архивного пакета.
Это отображается, когда пакет отображается в Меню пакетов. Оно должно занимать одну строку, в идеале не более 36 символов.
Это отображается в буфере, созданном командой C-h P (describe-package), после краткого описания пакета и статуса установки. Обычно оно занимает несколько строк и должно полностью описывать возможности пакета и то, как начать его использовать после установки.
Список других пакетов (возможно, включая минимально допустимые номера версий), от которых зависит этот пакет. Список может быть пустым, что означает, что у этого пакета нет зависимостей. В противном случае установка этого пакета также автоматически устанавливает его зависимости рекурсивно; если какая-либо зависимость не может быть найдена, пакет не может быть установлен.
Установка пакета, либо с помощью команды package-install-file, либо через Меню пакетов, создает подкаталог package-user-dir с именем name-version, где name — это имя пакета, а version — его версия (например, ~/.emacs.d/elpa/auctex-11.86/). Мы называем это каталогом содержимого пакета. Именно сюда Emacs помещает содержимое пакета (один файл Lisp для простого пакета или файлы, извлеченные из многофайлового пакета).
Затем Emacs ищет во всех файлах Lisp в каталоге содержимого магические комментарии автозагрузки (см. Автозагрузка). Эти определения автозагрузки сохраняются в файл с именем name-autoloads.el в каталоге содержимого. Обычно они используются для автозагрузки основных команд пользователя, определенных в пакете, но они также могут выполнять другие задачи, такие как добавление элемента в auto-mode-alist (см. Как Emacs выбирает основной режим). Обратите внимание, что пакет обычно не автозагружает каждую функцию и переменную, определенную в нем — только небольшое количество команд, которые обычно вызываются для начала использования пакета. Затем Emacs байт-компилирует каждый файл Lisp в пакете.
После установки пакет загружается: Emacs добавляет каталог содержимого пакета в load-path и вычисляет определения автозагрузки в name-autoloads.el.
При каждом запуске Emacs автоматически вызывает функцию package-activate-all, чтобы сделать установленные пакеты доступными для текущей сессии. Это происходит после загрузки файла ранней инициализации, но до загрузки основного файла инициализации (см. Сводка: последовательность действий при запуске). Пакеты не становятся доступными автоматически, если опция пользователя package-enable-at-startup установлена в nil в файле ранней инициализации.
Эта функция делает пакеты доступными для текущей сессии. Опция пользователя package-load-list указывает, какие пакеты сделать доступными; по умолчанию доступны все установленные пакеты. См. Установка пакетов в Руководство GNU Emacs.
В большинстве случаев вам не нужно вызывать package-activate-all, поскольку это делается автоматически при запуске. Просто убедитесь, что любой код, который должен выполниться до package-activate-all, находится в файле ранней инициализации, а любой код, который должен выполниться после него, — в основном файле инициализации (см. Файл инициализации в Руководство GNU Emacs).
Эта функция инициализирует внутренний реестр Emacs о том, какие пакеты установлены, а затем вызывает package-activate-all.
Необязательный аргумент no-activate, если он не равен nil, заставляет Emacs обновить свой реестр установленных пакетов, не делая их фактически доступными.