Локальные переменные файла
Файл может задавать значения локальных переменных; Emacs использует их для создания локальных для буфера привязок этих переменных в буфере, посещающем этот файл. Основные сведения о локальных переменных файлов см. в разделе Локальные переменные в файлах руководства Руководство GNU Emacs. В этом разделе описываются функции и переменные, влияющие на обработку локальных переменных файлов.
Если бы локальная переменная файла могла задавать произвольную функцию или выражение Lisp, которое будет вызвано позднее, посещение файла могло бы захватить управление вашим Emacs. Emacs защищается от этого, автоматически устанавливая только те локальные переменные файлов, заданные значения которых считаются безопасными. Остальные локальные переменные файлов устанавливаются только с согласия пользователя.
Для дополнительной безопасности при чтении локальных переменных файлов Emacs временно привязывает read-circle к nil (см. Функции ввода). Это не позволяет считывателю 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(см. Локальные переменные каталогов).Эта функция проходит по спискам ассоциаций, хранящимся в
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
Эта локальная для буфера переменная содержит список ассоциаций настроек локальных переменных файла. Каждый элемент этого списка имеет форму
(var . value), где var — символ локальной переменной, а value — её значение. При посещении файла Emacs сначала собирает все локальные переменные файла в этот список ассоциаций, а затем функция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 проверяется при загрузке файлов, функция должна быть эффективной и в идеале не должна приводить к загрузке библиотек для определения безопасности (например, она не должна быть функцией автозагрузки).
Чтобы определить свойства safe-local-variable для переменных, определённых в исходном коде на C, добавьте имена этих переменных и их свойства в список раздела «Safe local variables» файла files.el.
При определении пользовательского параметра с помощью defcustom можно задать его свойство safe-local-variable, добавив аргументы :safe function в defcustom (см. Определение переменных настройки). Однако предикат безопасности, определённый с помощью :safe, станет известен только после загрузки пакета, содержащего defcustom, что часто происходит слишком поздно. В качестве альтернативы можно использовать cookie автозагрузки (см. Автозагрузка), чтобы назначить параметру предикат безопасности, например так:
;;;###autoload (put 'var 'safe-local-variable 'pred)
Определения безопасных значений, заданные с помощью autoload, копируются в файл автозагрузки пакета (для большинства пакетов, поставляемых с Emacs, это loaddefs.el) и становятся известны 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 удаляет все текстовые свойства из строковых значений, заданных для локальных переменных файла.
Copyright © 1990-1996, 1998-2026 Free Software Foundation, Inc.
Licensed under the GNU GPL license.
https://www.gnu.org/software/emacs/manual/html_node/elisp/File-Local-Variables.html