Spec-Zone.ru › Elisp

Как 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API