Spec-Zone.ru › Elisp

Определение производных режимов

Рекомендуемый способ определения нового основного режима — наследование от существующего с помощью 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 имеет свойство, которое не является nil mode-class символом, то define-derived-mode устанавливает свойство mode-class variant на то же значение. Это гарантирует, например, что если 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

Spec-Zone.ru

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