Следующий: Загрузка не-ASCII символов, Предыдущий: Суффиксы загружаемых файлов, Вверх: Загрузка   [Оглавление][Указатель]


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

Когда 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, он затем добавляет ещё два каталога 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, вносимые этими файлами, будут потеряны после дампа.

Переменная: lisp-directory ¶

Эта переменная содержит строку с именем каталога, в котором находятся собственные файлы Emacs *.el и *.elc. Обычно это место, где эти файлы расположены в дереве установки Emacs, если только Emacs не запущен из каталога сборки, в этом случае он указывает на подкаталог lisp в каталоге исходников, из которых был собран Emacs.

Команда: locate-library library &optional nosuffix path interactive-call ¶

Эта команда находит точное имя файла для библиотеки library. Она ищет библиотеку так же, как это делает load, и аргумент nosuffix имеет тот же смысл, что и в load: не добавлять суффиксы ‘.elc’ или ‘.el’ к указанному имени library.

Если 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 в нативный код), то когда файл, скомпилированный в байт-код ‘.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.


Следующий: Загрузка не-ASCII символов, Предыдущий: Суффиксы загружаемых файлов, Вверх: Загрузка   [Оглавление][Указатель]