Когда Emacs загружает Lisp-библиотеку, он ищет её
в списке каталогов, задаваемом переменной 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,
он затем добавляет ещё два каталога site-lisp в начало
load-path. Они предназначены для локально установленных 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
и содержит код, который заставляет Emacs добавлять все подкаталоги этих
каталогов в load-path. Добавляются как непосредственные подкаталоги,
так и подкаталоги на несколько уровней вниз. Но исключаются
подкаталоги, имена которых не начинаются с буквы или цифры,
подкаталоги с именами RCS или CVS, а также подкаталоги,
содержащие файл с именем .nosearch.
Затем Emacs добавляет любые дополнительные каталоги загрузки, которые вы указываете с помощью опции командной строки -L (см. Аргументы действий в Руководстве пользователя GNU Emacs). Он также добавляет каталоги, в которые установлены дополнительные пакеты, если таковые имеются (см. Основы упаковки).
Обычно в файл инициализации (см. Файл инициализации)
добавляют код, чтобы добавить один или несколько каталогов в load-path. Например:
(push "~/.emacs.d/lisp" load-path)
См. push для описания push.
При дампе Emacs используется специальное значение load-path. Если вы используете
файл site-load.el или site-init.el для настройки
дампового Emacs (см. Сборка Emacs), любые изменения load-path,
вносимые этими файлами, будут потеряны после дампа.
Эта переменная содержит строку с именем каталога, в котором находятся собственные файлы Emacs *.el и *.elc. Обычно это место, где эти файлы расположены в дереве установки Emacs, если только Emacs не запущен из каталога сборки, в этом случае он указывает на подкаталог lisp в каталоге исходников, из которых был собран Emacs.
Эта команда находит точное имя файла для библиотеки library. Она
ищет библиотеку так же, как это делает load, и аргумент
nosuffix имеет тот же смысл, что и в load: не добавлять
суффиксы ‘.elc’ или ‘.el’ к указанному имени
library.
Если path не равен nil, используется этот список каталогов
вместо load-path.
Когда locate-library вызывается из программы, она возвращает имя
файла в виде строки. Когда пользователь запускает locate-library
интерактивно, аргумент interactive-call равен t, и это
указывает locate-library отображать имя файла в области эхо.
Эта команда показывает список затенённых файлов 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 в нативный код), то когда файл, скомпилированный
в байт-код ‘.elc’, найден при поиске по load-path, Emacs попытается
найти соответствующий файл ‘.eln’, содержащий соответствующий
нативно скомпилированный код. Нативно скомпилированные файлы ищутся в
каталогах, перечисленных в native-comp-eln-load-path.
Эта переменная содержит список каталогов, в которых Emacs ищет
нативно скомпилированные файлы ‘.eln’. Имена файлов в списке, которые
не являются абсолютными, интерпретируются как относительные относительно
invocation-directory (см. Окружение операционной системы). Последний каталог в списке — это
системный каталог, т.е. каталог с файлами ‘.eln’,
установленными в процессе сборки и установки Emacs. В каждом из
каталогов в списке Emacs ищет файлы ‘.eln’ в
подкаталоге, имя которого строится из версии Emacs и
8-символьного хеша, зависящего от текущего нативного
ABI; имя этого подкаталога хранится в переменной
comp-native-version-dir.