Поиск библиотек
Когда Emacs загружает библиотеку Lisp, он ищет её в списке каталогов, заданном переменной load-path.
- Переменная: load-path
Значение этой переменной — список каталогов, в которых следует искать файлы при загрузке с помощью
load. Каждый элемент — это строка (которая должна обозначать каталог) илиnil(обозначающий текущий рабочий каталог).
При запуске Emacs задаёт значение load-path в несколько этапов. Сначала он ищет каталог, содержащий собственные файлы Lisp, используя расположения по умолчанию, заданные при компиляции Emacs. Этот каталог сохраняется в lisp-directory. Обычно это каталог, куда устанавливаются файлы *.elc, например:
"/usr/local/share/emacs/version/lisp"
где version — версия Emacs. (В этом и последующих примерах замените /usr/local префиксом, соответствующим вашей установке Emacs.) Этот каталог и его подкаталоги содержат стандартные файлы Lisp, поставляемые вместе с Emacs. Если Emacs не удаётся найти собственные файлы Lisp, он не сможет запуститься корректно.
Если вы запускаете Emacs из каталога, в котором он был собран, то есть из ещё не установленного исполняемого файла, Emacs вместо этого инициализирует lisp-directory, используя подкаталог lisp каталога, содержащего исходный код, из которого он был собран.
Затем Emacs инициализирует load-path этим значением lisp-directory. Если Emacs был собран в отдельном от исходников каталоге, он также добавляет подкаталог lisp каталога сборки.
Все эти каталоги хранятся в двух указанных выше переменных в виде абсолютных имён файлов.
Если только вы не запускаете Emacs с параметром --no-site-lisp, он добавляет в начало load-path ещё два каталога site-lisp. Они предназначены для локально установленных файлов Lisp и обычно имеют следующий вид:
"/usr/local/share/emacs/version/site-lisp"
и
"/usr/local/share/emacs/site-lisp"
Первый предназначен для локально установленных файлов текущей version Emacs; второй — для локально установленных файлов, предназначенных для использования с любой установленной версией Emacs. (Если Emacs запущен без установки, он также добавляет подкаталоги site-lisp из каталогов исходников и сборки, если они существуют. Однако обычно в каталогах исходников и сборки подкаталогов site-lisp нет.)
Если задана переменная окружения EMACSLOADPATH, она изменяет описанную выше процедуру инициализации. Emacs инициализирует load-path на основе значения переменной окружения.
Синтаксис EMACSLOADPATH такой же, как у PATH; каталоги разделяются символом ‘:’ (или ‘;’ в некоторых операционных системах). Ниже приведён пример задания переменной EMACSLOADPATH (в оболочке в стиле sh):
export EMACSLOADPATH=/home/foo/.emacs.d/lisp:
Пустой элемент в значении переменной окружения — будь то конечный (как в примере выше, обратите внимание на конечный символ ‘:’), начальный или расположенный между другими элементами — заменяется значением load-path по умолчанию, определённым стандартной процедурой инициализации. Если пустых элементов нет, то EMACSLOADPATH задаёт весь список load-path. Необходимо указать либо пустой элемент, либо явный путь к каталогу со стандартными файлами Lisp, иначе Emacs не будет работать. (Ещё один способ изменить load-path — использовать параметр командной строки -L при запуске Emacs; см. ниже.)
Для каждого каталога в load-path Emacs проверяет, содержит ли он файл subdirs.el, и, если содержит, загружает его. Файл subdirs.el создаётся при сборке или установке Emacs и содержит код, который добавляет в load-path все подкаталоги этих каталогов. Добавляются как непосредственные подкаталоги, так и подкаталоги, расположенные на нескольких уровнях ниже. Однако исключаются подкаталоги, имена которых не начинаются с буквы или цифры, подкаталоги с именами RCS или CVS, а также подкаталоги, содержащие файл с именем .nosearch.
Затем Emacs добавляет все дополнительные каталоги загрузки, заданные параметром командной строки -L (см. раздел Аргументы действий в документе Руководство GNU Emacs). Он также добавляет каталоги, в которые установлены необязательные пакеты, если таковые имеются (см. раздел Основы упаковки).
Часто в файл инициализации (см. раздел Файл инициализации) добавляют код, включающий один или несколько каталогов в load-path. Например:
(push "~/.emacs.d/lisp" load-path)
Описание push см. в разделе push.
При создании дампа Emacs использует специальное значение load-path. Если для настройки Emacs перед созданием дампа вы используете файл site-load.el или site-init.el (см. раздел Сборка Emacs), все изменения load-path, внесённые этими файлами, будут потеряны после создания дампа.
- Переменная: lisp-directory
Эта переменная содержит строку с именем каталога, в котором находятся собственные файлы Emacs *.el и *.elc. Обычно это каталог в дереве установки Emacs, где расположены эти файлы. Если же Emacs запущен из каталога сборки, переменная указывает на подкаталог lisp в каталоге исходников, из которого был собран Emacs.
- Команда: locate-library library &optional nosuffix path interactive-call
-
Эта команда находит точное имя файла библиотеки library. Поиск выполняется так же, как в
load; аргумент nosuffix имеет то же значение, что и вload: не добавлять к указанному имени library суффиксы ‘.elc’ или ‘.el’.Если значение path не равно
nil, вместоload-pathиспользуется этот список каталогов.При вызове
locate-libraryиз программы имя файла возвращается в виде строки. Если пользователь запускаетlocate-libraryв интерактивном режиме, аргумент interactive-call равенt, что указываетlocate-libraryотобразить имя файла в области эха.
- Команда: list-load-path-shadows &optional stringp
-
Эта команда выводит список затенённых файлов Emacs Lisp. Затенённый файл — это файл, который обычно не будет загружен, несмотря на то, что находится в каталоге из
load-path, поскольку в каталоге, расположенном раньше вload-path, есть файл с таким же именем.Например, предположим, что
load-pathимеет значение("/opt/emacs/site-lisp" "/usr/share/emacs/29.1/lisp")и оба этих каталога содержат файл с именем foo.el. В этом случае
(require 'foo)никогда не загрузит файл из второго каталога. Такая ситуация может указывать на проблему с установкой Emacs.При вызове из Lisp эта функция выводит сообщение со списком затенённых файлов, а не отображает их в буфере. Если необязательный аргумент
stringpне равенnil, функция вместо этого возвращает затенённые файлы в виде строки.
Если Emacs скомпилирован с поддержкой нативной компиляции (см. раздел Компиляция Lisp в машинный код), то при обнаружении в ходе поиска по load-path байт-компилированного файла ‘.elc’ Emacs попытается найти соответствующий файл ‘.eln’, содержащий соответствующий нативно скомпилированный код. Поиск нативно скомпилированных файлов выполняется в каталогах, перечисленных в native-comp-eln-load-path.
- Переменная: native-comp-eln-load-path
Эта переменная содержит список каталогов, в которых Emacs ищет нативно скомпилированные файлы ‘.eln’. Имена файлов в списке, не являющиеся абсолютными, интерпретируются относительно
invocation-directory(см. раздел Окружение операционной системы). Последний каталог в списке — системный, то есть каталог с файлами ‘.eln’, установленными в ходе сборки и установки Emacs. В каждом каталоге из списка Emacs ищет файлы ‘.eln’ в подкаталоге, имя которого формируется из версии Emacs и 8-символьного хеша, зависящего от текущего ABI нативной компиляции; имя этого подкаталога хранится в переменнойcomp-native-version-dir.
Copyright © 1990-1996, 1998-2026 Free Software Foundation, Inc.
Licensed under the GNU GPL license.
https://www.gnu.org/software/emacs/manual/html_node/elisp/Library-Search.html