Поиск библиотек
При загрузке библиотеки Lisp в Emacs, он ищет её в списке каталогов, заданных переменной load-path.
- Переменная: load-path
Значение этой переменной представляет собой список каталогов, которые Emacs просматривает при загрузке файлов с помощью
load. Каждый элемент — это строка (которая должна быть каталогом) илиnil(обозначающая текущий рабочий каталог).
При запуске Emacs он устанавливает значение load-path в несколько этапов. Сначала он инициализирует load-path с помощью значений по умолчанию, заданных при компиляции Emacs. Обычно это каталог, похожий на
"/usr/local/share/emacs/version/lisp"
(В этих и последующих примерах замените /usr/local на префикс установки вашего Emacs.) Эти каталоги содержат стандартные файлы Lisp, которые поставляются с Emacs. Если Emacs не может их найти, он не запустится корректно.
Если вы запускаете Emacs из каталога, где он был скомпилирован — то есть, исполняемый файл, который не был формально установлен — Emacs вместо этого инициализирует load-path используя каталог lisp в каталоге, содержащем исходные файлы, из которых он был скомпилирован. Если вы компилировали Emacs в отдельном каталоге от исходных файлов, он также добавляет каталоги lisp из каталога сборки. (Во всех случаях элементы представлены абсолютными именами файлов.)
Если вы не запускаете Emacs с опцией --no-site-lisp, он затем добавляет ещё два каталога site-lisp в начало load-path. Они предназначены для локально установленных файлов Lisp и обычно имеют вид:
"/usr/local/share/emacs/version/site-lisp"
и
"/usr/local/share/emacs/site-lisp"
Первый — для локально установленных файлов для определённой версии 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 и содержит код, который заставляет Emacs добавлять все подкаталоги этих каталогов в load-path. Добавляются как непосредственные подкаталоги, так и подкаталоги на нескольких уровнях вглубь. Но он исключает подкаталоги, имена которых не начинаются с буквы или цифры, и подкаталоги с именами RCS или CVS, а также подкаталоги, содержащие файл с именем .nosearch.
Далее, Emacs добавляет все дополнительные каталоги загрузки, которые вы указываете с помощью опции командной строки -L (см. Аргументы действий в Руководстве пользователя GNU Emacs). Он также добавляет каталоги, где установлены дополнительные пакеты, если таковые имеются (см. Основные принципы упаковки).
Часто в файл инициализации (см. Файл инициализации) добавляется код для добавления одного или нескольких каталогов в load-path. Например:
(push "~/.emacs.d/lisp" load-path)
Дублирование Emacs использует специальное значение load-path. Если вы используете файл site-load.el или site-init.el для настройки дублируемого Emacs (см. Сборка Emacs), любые изменения в load-path внесённые этими файлами, будут потеряны после дублирования.
- Команда: locate-library library &optional nosuffix path interactive-call
Эта команда находит точное имя файла для библиотеки library. Она ищет библиотеку таким же образом, как и
load, а аргумент nosuffix имеет то же значение, что и вload: не добавлять суффиксы «.elc» или «.el» к указанному имени library.Если path не пуст, используется этот список каталогов вместо
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/23.3/lisp")и что оба этих каталога содержат файл с именем foo.el. Тогда
(require 'foo)никогда не загрузит файл во втором каталоге. Такая ситуация может указывать на проблему в процессе установки Emacs.При вызове из Lisp эта функция выводит сообщение со списком затенённых файлов вместо отображения их в буфере. Если необязательный аргумент
stringpне пустой, она вместо этого возвращает затенённые файлы в виде строки.
Если Emacs был скомпилирован с поддержкой нативного компилирования (см. Нативное компилирование), то при обнаружении файла «.elc» с байт-компилированным кодом при поиске в load-path, 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-2022 Free Software Foundation, Inc.
Licensed under the GNU GPL license.
https://www.gnu.org/software/emacs/manual/html_node/elisp/Library-Search.html