Spec-Zone.ru › Elisp

Поиск библиотек

Когда 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API