16.8 В каком файле определен определенный символ

Функция: symbol-file symbol &optional type native-p

Эта функция возвращает имя файла, в котором определен symbol. Если type равен nil, то приемлемо любое определение. Если type равен defun, defvar или defface, то указывается только определение функции, переменной или фейса.

Значение обычно представляет собой абсолютный путь к файлу. Оно также может быть nil, если определение не связано ни с каким файлом. Если symbol указывает на функцию, загружаемую по требованию (autoloaded), значение может быть относительным путем к файлу без расширения.

Если необязательный третий аргумент native-p не равен nil, и Emacs был собран с поддержкой нативной компиляции (см. Компиляция Lisp в нативный код), эта функция попытается найти файл .eln, в котором определен symbol, вместо файла .elc или .el. Если такой файл .eln найден и не устарел, функция вернет его абсолютный путь; в противном случае она сообщит имя либо исходного, либо байт-скомпилированного файла.

Основой для symbol-file являются данные в переменной load-history.

Переменная: load-history

Значение этой переменной — это alist, который связывает имена загруженных библиотечных файлов с именами функций и переменных, которые они определили, а также с функциями или требованиями, которые они предоставили или запросили.

Каждый элемент в этом alist описывает одну загруженную библиотеку (включая библиотеки, предварительно загруженные при запуске). Это список, чей CAR является абсолютным путем к библиотеке (строка). Остальные элементы списка имеют следующие формы:

var

Символ var был определен как переменная.

(defun . fun)

Была определена функция fun. (defun . fun), что представляет определение fun как функции.

(defface . face)

Был определен фейс face.

(require . feature)

Была запрошена функция feature.

(provide . feature)

Была предоставлена функция feature.

(cl-defmethod method specializers)

Именованный method был определен с использованием cl-defmethod, где specializers являются его специализаторами.

(define-type . type)

Был определен тип type.

Значение load-history может содержать один элемент, чей CAR равен nil. Этот элемент описывает определения, сделанные с помощью eval-buffer в буфере, который не просматривает файл.

Команда eval-region обновляет load-history, но делает это за счет добавления определенных символов к элементу для просматриваемого файла, а не замены этого элемента. См. Eval.

В дополнение к load-history, каждая функция отслеживает свою историю в символьном свойстве function-history. Причина, по которой функции обрабатываются отдельно в этом отношении, заключается в том, что часто функции определяются в два этапа в двух разных файлах (обычно один из них — autoload), поэтому, чтобы быть в состоянии должным образом выгрузить файл, нам нужно более точно знать, что этот файл сделал для определения функции.

Символьное свойство function-history содержит список вида (file1 def2 file2 def3 ...), где file1 — это последний файл, изменивший определение, а def2 — это определение до file1, установленное file2, и т. д. Логически этот список должен заканчиваться именем первого файла, который определил эту функцию, но для экономии места этот последний элемент обычно опускается.