12.12 Файловые локальные переменные

Файл может задавать значения локальных переменных; Emacs использует их для создания буферно-локальных привязок этих переменных в буфере, посещающем этот файл. См. Локальные переменные в файлах в Руководстве по GNU Emacs для получения базовой информации о файловых локальных переменных. В этом разделе описаны функции и переменные, влияющие на обработку файловых локальных переменных.

Если бы файловая локальная переменная могла задавать произвольную функцию или выражение Lisp, которое было бы вызвано позже, посещение файла могло бы захватить управление вашим Emacs. Emacs защищает от этого, автоматически устанавливая только те файловые локальные переменные, чьи заданные значения известны как безопасные. Другие файловые локальные переменные устанавливаются только с согласия пользователя.

Для дополнительной безопасности read-circle временно привязывается к nil, когда Emacs читает файловые локальные переменные (см. Функции ввода). Это предотвращает распознавание средством чтения Lisp циклических и разделяемых структур Lisp (см. Синтаксис чтения для циклических объектов).

Пользовательская опция: enable-local-variables

Эта переменная управляет обработкой файловых локальных переменных. Возможные значения:

t (по умолчанию)

Установить безопасные переменные и запросить (однократно) о любых небезопасных переменных.

:safe

Установить только безопасные переменные и не запрашивать.

:all

Установить все переменные и не запрашивать.

nil

Не устанавливать никакие переменные.

любое другое значение

Запросить (однократно) обо всех переменных.

Переменная: inhibit-local-variables-regexps

Это список регулярных выражений. Если имя файла соответствует одному из элементов этого списка, то этот файл не сканируется на наличие файловых локальных переменных любого вида. Примеры того, зачем это может понадобиться, см. в Как Emacs выбирает основной режим.

Переменная: permanently-enabled-local-variables

Некоторые настройки локальных переменных по умолчанию учитываются, даже если enable-local-variables равен nil. По умолчанию это касается только настройки локальной переменной lexical-binding, но это можно контролировать с помощью данной переменной, которая представляет собой список символов.

Переменная: safe-local-variable-directories

Это список каталогов, в которых локальные переменные всегда включены. Локальные переменные каталогов, загруженные из этих каталогов, например переменные из файла .dir-locals.el, будут включены, даже если они опасны. Каталоги в этом списке должны быть полностью раскрытыми абсолютными именами файлов. Они также могут быть удалёнными каталогами, если переменная enable-remote-dir-locals установлена в значение, отличное от nil.

Функция: hack-local-variables &optional handle-mode

Эта функция анализирует и, в зависимости от ситуации, связывает или вычисляет любые локальные переменные, заданные содержимым текущего буфера. Переменная enable-local-variables влияет на её работу. Однако эта функция не ищет локальную переменную ‘mode:’ в строке ‘-*-’. Это делает set-auto-mode, также принимая во внимание enable-local-variables (см. Как Emacs выбирает основной режим).

Эта функция также вводит в действие локальные переменные каталогов, заданные в файле .dir-locals.el. Если буфер не посещает никакой файл, то применяются те локальные переменные каталогов, которые были бы применимы к файлам в default-directory (см. Локальные переменные каталогов).

Эта функция работает путём обхода alist-ов, хранящихся в file-local-variables-alist и dir-local-variables-alist, и последовательного применения каждой локальной переменной. Она вызывает before-hack-local-variables-hook и hack-local-variables-hook до и после применения переменных соответственно. Она вызывает передний хук только если file-local-variables-alist не равен nil; другой хук она вызывает всегда. Эта функция игнорирует элемент ‘mode’, если он задаёт тот же основной режим, который уже есть в буфере.

Если необязательный аргумент handle-mode равен t, то всё, что делает эта функция — возвращает символ, задающий основной режим, если строка ‘-*-’ или список локальных переменных его задают, и nil в противном случае. Она не устанавливает режим и никакие другие файловые локальные переменные. Если handle-mode имеет любое значение, отличное от nil или t, любые настройки ‘mode’ в строке ‘-*-’ или списке локальных переменных игнорируются, а остальные настройки применяются. Если handle-mode равен nil, устанавливаются все файловые локальные переменные.

Переменная: file-local-variables-alist

Эта буферно-локальная переменная хранит alist настроек файловых локальных переменных. Каждый элемент alist имеет вид (var . value), где var — это символ локальной переменной, а value — её значение. Когда Emacs посещает файл, он сначала собирает все файловые локальные переменные в этот alist, а затем функция hack-local-variables применяет их одну за другой.

Переменная: before-hack-local-variables-hook

Emacs вызывает этот хук непосредственно перед применением файловых локальных переменных, хранящихся в file-local-variables-alist.

Переменная: hack-local-variables-hook

Emacs вызывает этот хук сразу после завершения применения файловых локальных переменных, хранящихся в file-local-variables-alist.

Вы можете задать безопасные значения для переменной с помощью свойства safe-local-variable. Свойство должно быть функцией одного аргумента; любое значение безопасно, если функция возвращает не nil при переданном этом значении. Многие часто встречающиеся файловые переменные имеют свойства safe-local-variable; к ним относятся fill-column, fill-prefix и indent-tabs-mode. Для безопасных булевых переменных используйте booleanp в качестве значения свойства.

Если вы хотите определить свойства safe-local-variable для переменных, определённых в исходном коде на C, добавьте имена и свойства этих переменных в список в разделе “Safe local variables” файла files.el.

При определении пользовательской опции с помощью defcustom вы можете установить её свойство safe-local-variable, добавив аргументы :safe function в defcustom (см. Определение настраиваемых переменных). Однако предикат безопасности, определённый с помощью :safe, станет известен только после загрузки пакета, содержащего defcustom, что часто происходит слишком поздно. В качестве альтернативы вы можете использовать автозагрузочную метку (см. Автозагрузка), чтобы назначить опции её предикат безопасности, например так:

;;;###autoload (put 'var 'safe-local-variable 'pred)

Определения безопасных значений, указанные с помощью autoload, копируются в файл автозагрузок пакета (loaddefs.el для большинства пакетов, поставляемых с Emacs), и становятся известны Emacs с самого начала сеанса.

Пользовательская опция: safe-local-variable-values

Эта переменная предоставляет ещё один способ пометить некоторые значения переменных как безопасные. Это список cons-ячеек вида (var . val), где var — имя переменной, а val — значение, которое для этой переменной безопасно.

Когда Emacs спрашивает пользователя, следует ли применить набор файловых локальных переменных, пользователь может выбрать пометку их как безопасных. Это действие добавляет соответствующие пары переменная/значение в safe-local-variable-values и сохраняет их в пользовательский файл настроек.

Пользовательская опция: ignored-local-variable-values

Если существуют некоторые значения конкретных локальных переменных, которые вы всегда хотите полностью игнорировать, вы можете использовать эту переменную. Её значение имеет ту же форму, что и safe-local-variable-values; настройка файловой локальной переменной на значение, присутствующее в списке, всегда будет игнорироваться при обработке локальных переменных, заданных файлом. Как и в случае с той переменной, когда Emacs запрашивает у пользователя, следует ли применять файловые локальные переменные, пользователь может выбрать постоянное игнорирование их конкретных значений, что изменит эту переменную и сохранит её в пользовательский файл настроек. Пары переменная-значение, присутствующие в этой переменной, имеют приоритет над теми же парами в safe-local-variable-values.

Функция: safe-local-variable-p sym val

Эта функция возвращает не nil, если переменной sym безопасно присвоить значение val, основываясь на вышеуказанных критериях.

Некоторые переменные считаются опасными. Если переменная опасна, она никогда не добавляется автоматически в safe-local-variable-values; Emacs всегда запрашивает подтверждение перед установкой опасной переменной, если только пользователь явно не разрешил значение, настроив safe-local-variable-values напрямую.

Любая переменная, имя которой имеет свойство risky-local-variable, не равное nil, считается опасной. При определении пользовательской опции с помощью defcustom вы можете установить её свойство risky-local-variable, добавив аргументы :risky value в defcustom (см. Определение настраиваемых переменных). Кроме того, любая переменная, имя которой оканчивается на ‘-command’, ‘-frame-alist’, ‘-function’, ‘-functions’, ‘-hook’, ‘-hooks’, ‘-form’, ‘-forms’, ‘-map’, ‘-map-alist’, ‘-mode-alist’, ‘-program’ или ‘-predicate’, автоматически считается опасной. Переменные ‘font-lock-keywords’, ‘font-lock-keywords’ с последующей цифрой, а также ‘font-lock-syntactic-keywords’ также считаются опасными.

Функция: risky-local-variable-p sym

Эта функция возвращает не nil, если sym является опасной переменной, основываясь на вышеуказанных критериях.

Переменная: ignored-local-variables

Эта переменная содержит список переменных, которым файлы не должны присваивать локальные значения. Любое значение, указанное для одной из этих переменных, полностью игнорируется.

“Переменная” ‘Eval:’ также является потенциальной лазейкой, поэтому Emacs обычно запрашивает подтверждение перед её обработкой.

Пользовательская опция: enable-local-eval

Эта переменная управляет обработкой ‘Eval:’ в строках ‘-*-’ или списках локальных переменных в посещаемых файлах. Значение t означает обрабатывать их безоговорочно; nil — игнорировать их; любое другое значение означает спрашивать пользователя, что делать для каждого файла. Значение по умолчанию — maybe.

Пользовательская опция: safe-local-eval-forms

Эта переменная содержит список выражений, которые безопасно вычислять, когда они встречаются в “переменной” ‘Eval:’ в списке файловых локальных переменных.

Если выражение является вызовом функции, и функция имеет свойство safe-local-eval-function, значение свойства определяет, безопасно ли вычислять выражение. Значение свойства может быть предикатом для проверки выражения, списком таких предикатов (безопасно, если хотя бы один предикат успешен) или t (всегда безопасно при условии, что аргументы константны).

Текстовые свойства также являются потенциальными лазейками, поскольку их значения могут содержать функции для вызова. Поэтому Emacs отбрасывает все текстовые свойства из строковых значений, указанных для файловых локальных переменных.