Spec-Zone.ru › Elisp

Хуки режима

Каждая команда основного режима должна завершаться запуском независимого от режима обычного хука 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

Spec-Zone.ru

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