Как Emacs выбирает основной режим
Когда Emacs открывает файл, он автоматически выбирает основной режим для буфера на основе информации в имени файла или самом файле. Он также обрабатывает локальные переменные, указанные в тексте файла.
- Команда: normal-mode &optional find-file
-
Эта функция устанавливает правильный основной режим и привязки буферных локальных переменных для текущего буфера. Она вызывает
set-auto-mode(см. ниже). Начиная с Emacs 26.1, она больше не выполняетhack-local-variables, это теперь делается вrun-mode-hooksпри инициализации основных режимов (см. Обработчики режимов).Если аргумент find-file для
normal-modeнеnil,normal-modeпредполагает, что функциюfind-fileвызывает её. В этом случае она может обработать локальные переменные в строке ‘-*-’ или в конце файла. Переменнаяenable-local-variablesконтролирует выполнение этой обработки. Смотрите Локальные переменные в файлах в Руководстве по GNU Emacs для синтаксиса раздела локальных переменных файла.Если вы запускаете
normal-modeинтерактивно, аргумент find-file обычноnil. В этом случаеnormal-modeбезусловно обрабатывает любые локальные переменные файла.Функция вызывает
set-auto-modeдля выбора и установки основного режима. Если это не определяет режим, буфер остается в основном режиме, определенном значением по умолчаниюmajor-mode(см. ниже).normal-modeиспользуетcondition-caseвокруг вызова команды основного режима, чтобы ошибки были пойманы и отображены как «Ошибка спецификации режима файла», за которым следует исходное сообщение об ошибке.
- Функция: set-auto-mode &optional keep-mode-if-same
-
Эта функция выбирает и устанавливает основной режим, подходящий для текущего буфера. Она основывает свое решение (в порядке приоритета) на строке ‘-*-’, на любой локальной переменной ‘mode:’ вблизи конца файла, на строке ‘#!’ (используя
interpreter-mode-alist), на тексте в начале буфера (используяmagic-mode-alist) и, наконец, на имени посещаемого файла (используяauto-mode-alist). Смотрите Как выбираются основные режимы в Руководстве по GNU Emacs. Еслиenable-local-variablesравноnil,set-auto-modeне проверяет строку ‘-*-’ или вблизи конца файла на наличие тега режима.Есть некоторые типы файлов, для которых нецелесообразно сканировать содержимое файла в поисках спецификатора режима. Например, архив tar может содержать вблизи конца файла член-файл, который имеет раздел локальных переменных, определяющий режим для этого конкретного файла. Это не должно применяться к содержащему архиву tar. Аналогично, файл изображения tiff может просто содержать первую строку, которая, кажется, соответствует шаблону ‘-*-’. По этим причинам оба этих расширения файлов являются членами списка
inhibit-local-variables-regexps. Добавляйте шаблоны в этот список, чтобы предотвратить поиск Emacs в них локальных переменных любого рода (не только спецификаторов режима).Если keep-mode-if-same не
nil, эта функция не вызывает команду режима, если буфер уже находится в нужном основном режиме. Например,set-visited-file-nameустанавливает это вtдля предотвращения уничтожения буферных локальных переменных, которые пользователь мог установить.
- Функция: set-buffer-major-mode buffer
-
Эта функция устанавливает основной режим буфера buffer в значение по умолчанию
major-mode; если этоnil, она использует текущий основной режим буфера (если это подходит). В качестве исключения, если имя буфера buffer равно *scratch*, она устанавливает режим вinitial-major-mode.Низкоуровневые примитивы для создания буферов не используют эту функцию, но команды среднего уровня, такие как
switch-to-bufferиfind-file-noselect, используют её всякий раз, когда создают буферы.
- Пользовательский параметр: initial-major-mode
-
Значение этой переменной определяет основной режим начального буфера *scratch*. Значение должно быть символом, являющимся командой основного режима. Значение по умолчанию —
lisp-interaction-mode.
- Переменная: interpreter-mode-alist
Эта переменная определяет основные режимы для использования для скриптов, которые указывают интерпретатор команд в строке ‘#!’. Её значение — список ассоциаций со элементами вида
(regexp . mode); это означает, что следует использовать режим mode, если файл указывает интерпретатор, который соответствует\\`regexp\\'. Например, один из элементов по умолчанию —("python[0-9.]*" . python-mode).
- Переменная: magic-mode-alist
Значение этой переменной — список ассоциаций со элементами вида
(regexp . function), где regexp — регулярное выражение, а function — функция илиnil. После посещения файлаset-auto-modeвызывает function, если текст в начале буфера соответствует regexp, и function неnil; если function равнаnil,auto-mode-alistрешает режим.
- Переменная: magic-fallback-mode-alist
Это работает как
magic-mode-alist, за исключением того, что оно обрабатывается только еслиauto-mode-alistне определяет режим для этого файла.
- Переменная: auto-mode-alist
-
Эта переменная содержит список ассоциаций шаблонов имен файлов (регулярные выражения) и соответствующих команд основного режима. Обычно шаблоны имен файлов проверяют суффиксы, такие как ‘.el’ и ‘.c’, но это необязательно. Обычный элемент списка ассоциаций выглядит как
(regexp . mode-function).Например,
(("\\`/tmp/fol/" . text-mode) ("\\.texinfo\\'" . texinfo-mode) ("\\.texi\\'" . texinfo-mode)("\\.el\\'" . emacs-lisp-mode) ("\\.c\\'" . c-mode) ("\\.h\\'" . c-mode) …)Когда вы посещаете файл, расширенное имя файла (см. Расширение имен файлов), с удаленными номерами версии и суффиксами резервного копирования с помощью
file-name-sans-versions(см. Компоненты имен файлов), соответствует regexp,set-auto-modeвызывает соответствующую функцию mode-function. Эта функция позволяет Emacs выбирать правильный основной режим для большинства файлов.Если элемент
auto-mode-alistимеет вид(regexp function t), то после вызова function Emacs повторно ищетauto-mode-alistна соответствие части имени файла, которая не совпала ранее. Эта функция полезна для пакетов разархивирования: запись вида("\\.gz\\'" function t)может разархивировать файл и затем поместить разархивированный файл в правильный режим в соответствии с именем без ‘.gz’.Если
auto-mode-alistимеет более одного элемента, чьё regexp соответствует имени файла, Emacs будет использовать первое соответствие.Вот пример того, как добавить несколько пар шаблонов к
auto-mode-alist. (Вы можете использовать этот тип выражения в своём файле инициализации.)(setq auto-mode-alist (append ;; File name (within directory) starts with a dot. '(("/\\.[^/]*\\'" . fundamental-mode) ;; File name has no dot. ("/[^\\./]*\\'" . fundamental-mode) ;; File name ends in ‘.C’. ("\\.C\\'" . c++-mode)) auto-mode-alist))
Copyright © 1990-1996, 1998-2022 Free Software Foundation, Inc.
Licensed under the GNU GPL license.
https://www.gnu.org/software/emacs/manual/html_node/elisp/Auto-Major-Mode.html