Код для каждого основного режима должен следовать различным соглашениям по оформлению, включая соглашения по инициализации локальной клавиатурной таблицы и синтаксической таблицы, именованию функций и переменных, а также хукам.
Если вы используете макрос define-derived-mode, он позаботится о многих из этих соглашений автоматически. См. Определение производных режимов. Обратите также внимание, что Фундаментальный режим является исключением из многих из этих соглашений, поскольку он представляет состояние Emacs по умолчанию.
Следующий список соглашений является лишь частичным. Каждый основной режим должен стремиться к согласованности в целом с другими основными режимами Emacs, поскольку это делает Emacs в целом более целостным. Невозможно перечислить здесь все возможные моменты, где может возникнуть этот вопрос; если разработчики Emacs укажут на область, где ваш основной режим отклоняется от обычных соглашений, пожалуйста, сделайте его совместимым.
Строка документации может включать специальные подстроки документации, ‘\[команда]’, ‘\{клавиатурная_таблица}’ и ‘\<клавиатурная_таблица>’, которые позволяют отображению справки автоматически адаптироваться к собственным привязкам клавиш пользователя. См. Подстановка привязок клавиш в документации.
kill-all-local-variables. Это запускает обычный хук change-major-mode-hook, затем удаляет буферно-локальные переменные ранее действовавшего основного режима. См. Создание и удаление буферно-локальных привязок.
major-mode в символ команды основного режима. Так describe-mode узнаёт, какую документацию выводить.
mode-name в “красивое” имя режима, обычно строку (но см. Структура данных строки режима для других возможных форм). Имя режима отображается в строке режима.
indent-line-function в подходящую функцию и, вероятно, настроить другие переменные для отступов. См. Автоматический отступ кода.
use-local-map для установки этой локальной таблицы. См. Активные клавиатурные таблицы для получения дополнительной информации.
Эта клавиатурная таблица должна постоянно храниться в глобальной переменной с именем имя_режима-mode-map. Обычно библиотека, определяющая режим, устанавливает эту переменную.
См. Советы по надёжному определению переменных для рекомендаций по написанию кода для настройки переменной клавиатурной таблицы режима.
Основной режим также может переназначать клавиши M-n, M-p и M-s. Привязки для M-n и M-p обычно должны быть некоторым видом перемещения вперёд и назад, но это не обязательно означает движение курсора.
Для основного режима допустимо переназначать стандартную последовательность клавиш, если он предоставляет команду, которая выполняет ту же работу более подходящим для текста этого режима способом. Например, основной режим для редактирования языка программирования может переопределить C-M-a для перехода к началу функции способом, который лучше работает для этого языка. Рекомендуемый способ адаптации C-M-a к нуждам основного режима — установить beginning-of-defun-function (см. Перемещение по сбалансированным выражениям) для вызова функции, специфичной для режима.
Также допустимо для основного режима переназначать стандартную последовательность клавиш, стандартное значение которой редко полезно в этом режиме. Например, режимы минибуфера переназначают M-r, стандартное значение которого редко бывает полезно в минибуфере. Основные режимы, такие как Dired или Rmail, которые не допускают самовставки текста, могут обоснованно переназначать буквы и другие печатные символы в специальные команды.
имя_режима-mode-syntax-table. См. Синтаксические таблицы.
имя_режима-mode-abbrev-table. Если команда основного режима сама определяет какие-либо аббревиатуры, она должна передавать t для аргумента system-flag в define-abbrev. См. Определение аббревиатур.
font-lock-defaults (см. Режим Font Lock).
context-menu-mode (см. Щелчки мыши по меню в Руководстве Emacs). Для этого определите специфичную для режима функцию, которая строит одно или несколько меню в зависимости от расположения щелчка mouse-3 в буфере, а затем добавьте эту функцию в буферно-локальное значение context-menu-functions.
imenu-generic-expression, для двух переменных imenu-prev-index-position-function и imenu-extract-index-name-function или для переменной imenu-create-index-function (см. Imenu).
outline-regexp или outline-search-function, а также для переменной outline-level (см. Дополнительный режим Outline).
eldoc-documentation-functions.
completion-at-point-functions. См. Дополнение в обычных буферах.
make-local-variable в команде основного режима, а не make-variable-buffer-local. Последняя функция сделала бы переменную локальной для каждого буфера, в котором она впоследствии устанавливается, что повлияло бы на буферы, не использующие этот режим. Нежелательно, чтобы режим имел такие глобальные эффекты. См. Буферно-локальные переменные.
За редкими исключениями, единственный разумный способ использования make-variable-buffer-local в пакете Lisp — для переменной, которая используется только внутри этого пакета. Использование её для переменной, используемой другими пакетами, мешало бы им.
имя_режима-mode-hook. Последним, что должна делать команда основного режима, является вызов run-mode-hooks. Это запускает обычный хук change-major-mode-after-body-hook, хук режима, функцию hack-local-variables (когда буфер посещает файл) и затем обычный хук after-change-major-mode-hook. См. Хуки режимов.
define-derived-mode, но это не обязательно. Такой режим должен вызывать команду родительского режима внутри формы delay-mode-hooks. (Использование define-derived-mode делает это автоматически.) См. Определение производных режимов и Хуки режимов.
change-major-mode-hook (см. Создание и удаление буферно-локальных привязок).
mode-class со значением special, установленное следующим образом:
(put 'забавный-режим 'mode-class 'special)
Это указывает Emacs, что новые буферы, создаваемые, пока текущий буфер находится в Забавном режиме, не должны помещаться в Забавный режим, даже если значение по умолчанию major-mode равно nil. По умолчанию значение nil для major-mode означает использование основного режима текущего буфера при создании новых буферов (см. Как Emacs выбирает основной режим), но для таких special режимов вместо этого используется Фундаментальный режим. Режимы, такие как Dired, Rmail и Список буферов, используют эту возможность.
Функция view-buffer не включает Режим просмотра в буферах, чей mode-class является special, поскольку такие режимы обычно предоставляют свои собственные привязки, подобные View.
Макрос define-derived-mode автоматически помечает производный режим как специальный, если родительский режим является специальным. Специальный режим является удобным родителем для таких режимов, чтобы наследовать от него; См. Базовые основные режимы.
auto-mode-alist для выбора режима для этих имён файлов (см. Как Emacs выбирает основной режим). Если вы определяете команду режима для автозагрузки, вы должны добавить этот элемент в тот же файл, который вызывает autoload. Если вы используете cookie автозагрузки для команды режима, вы также можете использовать cookie автозагрузки для формы, которая добавляет элемент (см. cookie автозагрузки). Если вы не автозагружаете команду режима, достаточно добавить элемент в файл, содержащий определение режима.
defvar или defcustom для установки переменных, связанных с режимом, чтобы они не переинициализировались, если уже имеют значение (см. Определение глобальных переменных).