24.2.6 Хуки режимов

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