Определение производных режимов
Рекомендуемый способ определения нового основного режима — наследование от существующего с помощью define-derived-mode. Если нет близкого по смыслу режима, следует унаследовать от text-mode, special-mode, или prog-mode. См. Основные режимы. Если ни один из них не подходит, можно унаследовать от fundamental-mode (см. Основные режимы).
- Макрокоманда: define-derived-mode variant parent name docstring keyword-args… body…
-
Эта макрокоманда определяет variant как команду основного режима, используя name в качестве строковой формы имени режима. variant и parent должны быть необрамлёнными символами.
Новая команда variant определена для вызова функции parent, а затем переопределяет определенные аспекты этого родительского режима:
- Новый режим имеет свою собственную карту горячих клавиш, названную
variant-map.define-derived-modeделает карту горячих клавиш родительского режима родителем новой карты, еслиvariant-mapещё не задан или не имеет родителя. - Новый режим имеет свою собственную таблицу синтаксиса, хранящуюся в переменной
variant-syntax-table, если вы не переопределите её с помощью ключевого слова:syntax-table(см. ниже).define-derived-modeделает таблицу синтаксиса родительского режима родителемvariant-syntax-table, если последний ещё не задан или уже имеет родителя, отличного от стандартной таблицы синтаксиса. - Новый режим имеет свою собственную таблицу сокращений, хранящуюся в переменной
variant-abbrev-table, если вы не переопределите её с помощью ключевого слова:abbrev-table(см. ниже). - Новый режим имеет свою собственную функцию обработки режима
variant-hook. Она выполняется после выполнения функций обработчиков режимов его предков, сrun-mode-hooks, как последняя операция, помимо выполнения любой:after-hookформы, которую он может иметь. См. Функции обработки режимов.
Кроме того, вы можете указать, как переопределить другие аспекты parent с помощью body. Команда variant вычисляет формы в body после настройки всех обычных переопределений, непосредственно перед запуском функций обработки режима.
Если parent имеет свойство, которое не является
nilmode-classсимволом, тоdefine-derived-modeустанавливает свойствоmode-classvariant на то же значение. Это гарантирует, например, что если parent — это специальный режим, то и variant также является специальным (см. Конвенции основных режимов).Вы также можете указать
nilдля parent. Это лишает новый режим родителя. Тогдаdefine-derived-modeведёт себя как описано выше, но, конечно, пропускает все действия, связанные с parent.Аргумент docstring задаёт строку документации для нового режима.
define-derived-modeдобавляет общую информацию о функции обработки режима, после чего карту горячих клавиш в конце этой строки документации. Если вы опустите docstring,define-derived-modeсгенерирует строку документации.Ключевые аргументы keyword-args — это пары ключевых слов и значений. Значения, за исключением значений
:after-hook, вычисляются. В настоящее время поддерживаются следующие ключевые слова::syntax-table-
Вы можете использовать его, чтобы явно задать таблицу синтаксиса для нового режима. Если вы укажете значение
nil, новый режим будет использовать ту же таблицу синтаксиса, что и parent, или стандартную таблицу синтаксиса, если parent —nil. (Обратите внимание, что это не следует соглашению, используемому для аргументов без ключевых слов, в котором значениеnilэквивалентно отсутствию аргумента.) :abbrev-table-
Вы можете использовать его, чтобы явно указать таблицу сокращений для нового режима. Если вы укажете значение
nil, новый режим будет использовать ту же таблицу сокращений, что и parent, илиfundamental-mode-abbrev-table, если parent —nil. (Опять же, значениеnilне эквивалентно отсутствию этого ключевого слова.) :interactive-
Режимы по умолчанию являются интерактивными командами. Если вы укажете значение
nil, режим, определённый здесь, не будет интерактивным. Это полезно для режимов, которые никогда не должны активироваться пользователями вручную, а должны использоваться только в буферах с особым форматом. :group-
Если это указано, значение должно быть группой настроек для этого режима. (Не все основные режимы имеют одну.) Команда
customize-modeиспользует это.define-derived-modeне автоматически определяет указанную группу настроек. :after-hookЭто необязательное ключевое слово указывает одну форму Lisp, которую нужно вычислить как последний акт функции режима после того, как были запущены функции обработки режима. Она не должна быть обрамлена кавычками. Так как эта форма может быть вычислена после того, как функция режима завершилась, она не должна обращаться к каким-либо элементам локального состояния функции режима. Форма
:after-hookполезна для настройки аспектов режима, которые зависят от настроек пользователя, которые, в свою очередь, могут быть изменены в функции обработки режима.
Вот гипотетический пример:
(defvar hypertext-mode-map (let ((map (make-sparse-keymap))) (define-key map [down-mouse-3] 'do-hyper-link) map)) (define-derived-mode hypertext-mode text-mode "Hypertext" "Major mode for hypertext." (setq-local case-fold-search nil))Не пишите спецификацию
interactiveв определении;define-derived-modeделает это автоматически. - Новый режим имеет свою собственную карту горячих клавиш, названную
- Функция: derived-mode-p &rest modes
Эта функция возвращает не-
nil, если текущий основной режим является производным от любого из основных режимов, заданных символами modes.
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/Derived-Modes.html