Хуки режима
Каждая команда основного режима должна завершаться запуском независимого от режима обычного хука 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-globalized-minor-mode, в буферах, использующих эти основные режимы. Если вы встретите такой основной режим, исправьте его, чтобы он следовал этим соглашениям.
При определении основного режима с помощью 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-2026 Free Software Foundation, Inc.
Licensed under the GNU GPL license.
https://www.gnu.org/software/emacs/manual/html_node/elisp/Mode-Hooks.html