Вспомогательные функции режима
Каждая основная команда режима должна завершаться выполнением независимой от режима нормальной функции change-major-mode-after-body-hook, ее функции режима и нормальной функции after-change-major-mode-hook. Это делается путем вызова run-mode-hooks. Если основной режим является производным режимом, то есть если он вызывает другой основной режим (родительский режим) в своем теле, это должно быть выполнено внутри delay-mode-hooks, чтобы родительский режим не выполнял эти функции сам. Вместо этого вызов производным режимом run-mode-hooks также выполняет функцию режима родительского режима. См. Основные соглашения о режиме.
В версиях Emacs до Emacs 22 не было delay-mode-hooks. В версиях до 24 не было change-major-mode-after-body-hook. Когда созданные пользователем основные режимы не используют run-mode-hooks и не были обновлены для использования этих новых функций, они не полностью следуют этим соглашениям: они могут запускать функцию режима родительского режима слишком рано или не запускать after-change-major-mode-hook. Если вы столкнетесь с таким основным режимом, исправьте его в соответствии с этими соглашениями.
При определении основного режима с помощью define-derived-mode, эти соглашения автоматически соблюдаются. Если вы определяете основной режим «вручную», не используя define-derived-mode, используйте следующие функции для автоматического соблюдения этих соглашений.
- Функция: run-mode-hooks &rest hookvars
-
Основные режимы должны выполнять свою функцию режима с помощью этой функции. Она похожа на
run-hooks(см. Функции), но также выполняетchange-major-mode-after-body-hook,hack-local-variables(когда буфер посещает файл) (см. Файловые локальные переменные) иafter-change-major-mode-hook. Последнее, что она делает, это вычисляет все:after-hookформы, объявленные родительскими режимами (см. Производные режимы).Когда эта функция вызывается во время выполнения
delay-mode-hooksформы, она не выполняет функции илиhack-local-variablesили вычисляет формы немедленно. Вместо этого она организует выполнение их при следующем вызовеrun-mode-hooks.
- Макрос: delay-mode-hooks body…
-
Когда одна команда основного режима вызывает другую, она должна делать это внутри
delay-mode-hooks.Этот макрос выполняет body, но сообщает всем вызовам
run-mode-hooksво время выполнения body отложить выполнение своих функций. Функции фактически будут выполнены во время следующего вызоваrun-mode-hooksпосле окончания конструкцииdelay-mode-hooks.
- Переменная: change-major-mode-after-body-hook
Это обычная функция, выполняемая
run-mode-hooks. Она выполняется до функций режима.
- Переменная: after-change-major-mode-hook
Это обычная функция, выполняемая
run-mode-hooks. Она выполняется в самом конце каждой правильно написанной команды основного режима.
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/Mode-Hooks.html