Каталог может задавать значения локальных переменных, общие для всех файлов в этом каталоге; Emacs использует их для создания привязок, локальных для буфера, для этих переменных в буферах, посещающих любой файл в этом каталоге. Это полезно, когда файлы в каталоге принадлежат некоторому проекту и поэтому используют одни и те же локальные переменные.
Существует два различных способа задания локальных переменных каталога: помещение их в специальный файл или определение класса проекта для этого каталога.
Эта константа содержит имя файла, в котором Emacs ожидает найти локальные переменные каталога. Имя файла — .dir-locals.el12. Файл с таким именем в каталоге заставляет Emacs применять его настройки к любому файлу в этом каталоге или любом из его подкаталогов (при желании вы можете исключить подкаталоги; см. ниже). Если в некоторых из подкаталогов есть свои файлы .dir-locals.el, Emacs использует настройки из самого глубокого файла, который он находит, начиная с каталога файла и поднимаясь вверх по дереву каталогов. Эта константа также используется для получения имени второго файла локальных переменных каталога .dir-locals-2.el. Если этот второй файл присутствует в том же каталоге, что и .dir-locals.el, то он будет загружен в дополнение к .dir-locals.el. Это полезно, когда .dir-locals.el находится под управлением версий в общем репозитории и не может использоваться для личных настроек. Файл задает локальные переменные в виде специально отформатированного списка; подробнее см. Локальные переменные для каждого каталога в Руководстве по GNU Emacs.
Эта функция читает файл .dir-locals.el и сохраняет локальные переменные каталога в file-local-variables-alist, который является локальным для буфера, посещающего любой файл в каталоге, без их применения. Она также сохраняет настройки локальных переменных каталога в dir-locals-class-alist, где определяет специальный класс для каталога, в котором был найден файл .dir-locals.el. Эта функция работает путем вызова dir-locals-set-class-variables и dir-locals-set-directory-class, описанных ниже.
Эта функция ищет локальные переменные каталога и немедленно применяет их в текущем буфере. Она предназначена для вызова в командах режимов для буферов, не связанных с файлами, например, в буферах Dired, чтобы они подчинялись настройкам локальных переменных каталога. Для буферов, не связанных с файлами, Emacs ищет локальные переменные каталога в default-directory и его родительских каталогах.
Эта функция определяет набор настроек переменных для именованного class, который является символом. Позже вы можете назначить этот класс одному или нескольким каталогам, и Emacs применит эти настройки переменных ко всем файлам в этих каталогах. Список в variables может иметь одну из двух форм: (major-mode . alist) или (directory . list). В первой форме, если буфер файла включает режим, производный от major-mode, то применяются все переменные из соответствующего alist; alist должен иметь вид (name . value). Специальное значение nil для major-mode означает, что настройки применимы к любому режиму. В alist вы можете использовать специальное name: subdirs. Если соответствующее значение равно nil, то alist применяется только к файлам в соответствующем каталоге, а не к файлам в каких-либо подкаталогах.
Во второй форме variables, если directory является начальной подстрокой каталога файла, то list применяется рекурсивно в соответствии с приведенными выше правилами; list должен иметь одну из двух форм, принимаемых этой функцией в variables.
Эта функция назначает class всем файлам в directory и его подкаталогах. Впоследствии все настройки переменных, заданные для class, будут применяться к любому посещаемому файлу в directory и его подкаталогах. class должен быть уже определен с помощью dir-locals-set-class-variables.
Emacs использует эту функцию внутренне при загрузке переменных каталога из файла .dir-locals.el. В этом случае необязательный аргумент mtime содержит время изменения файла (возвращаемое file-attributes). Emacs использует это время для проверки того, что сохраненные локальные переменные все еще действительны. Если вы назначаете класс напрямую, а не через файл, этот аргумент должен быть nil.
Этот alist содержит символы классов и связанные с ними настройки переменных. Он обновляется с помощью dir-locals-set-class-variables.
Этот alist содержит имена каталогов, назначенные им имена классов и время изменения соответствующего файла локальных переменных каталога (если такой есть). Функция dir-locals-set-directory-class обновляет этот список.
Эта локальная для буфера переменная содержит alist настроек локальных переменных каталога. Каждый элемент alist имеет вид (var . value), где var — это символ локальной переменной, а value — её значение (это та же структура, что и в file-local-variables-alist, см. Локальные переменные файла). Когда Emacs посещает файл, он собирает все локальные переменные каталога в этот alist, а затем функция hack-local-variables применяет их одну за другой (опять же, см. Локальные переменные файла).
Этот специальный хук содержит функции, которые собирают локальные переменные каталога для использования в данном буфере. По умолчанию он содержит только функцию, подчиняющуюся другим настройкам, описанным в данном разделе. Но его можно использовать для добавления поддержки дополнительных источников локальных переменных каталога, например, используемых другими текстовыми редакторами.
Функции в этом хуке вызываются без аргументов в буфере, для которого мы собираемся применить локальные переменные каталога, после того как функция основного режима буфера была запущена, чтобы они могли использовать источники информации, такие как major-mode или buffer-file-name, для поиска переменных, которые должны быть применены.
Она должна возвращать либо cons-ячейку вида (directory . alist), либо список таких cons-ячеек. Возвращаемое значение nil означает, что локальные переменные каталога не найдены. directory должна быть строкой: именем каталога, к которому применяются переменные. alist — это список переменных вместе с их значениями, применяемыми к текущему буферу, где каждый элемент имеет вид (varname . value).
Различные alist, возвращаемые этими функциями, будут объединены, и в случае конфликтов настройки из более глубоких каталогов будут иметь приоритет над настройками из более высоких каталогов в иерархии каталогов. Наконец, поскольку этот хук запускается каждый раз при посещении файла, важно стараться поддерживать эффективность этих функций, что обычно потребует некоторого вида кэширования.
Если nil, локальные переменные каталога игнорируются. Эта переменная может быть полезна для режимов, которые хотят игнорировать локальные переменные каталога, но при этом учитывать локальные переменные файла (см. Локальные переменные файла).
Версия Emacs для MS-DOS использует _dir-locals.el вместо этого из-за ограничений файловых систем DOS.