Mode Hooks
Every major mode command should finish by running the mode-independent normal hook change-major-mode-after-body-hook
, its mode hook, and the normal hook after-change-major-mode-hook
. It does this by calling run-mode-hooks
. If the major mode is a derived mode, that is if it calls another major mode (the parent mode) in its body, it should do this inside delay-mode-hooks
so that the parent won’t run these hooks itself. Instead, the derived mode’s call to run-mode-hooks
runs the parent’s mode hook too. See Major Mode Conventions.
Emacs versions before Emacs 22 did not have delay-mode-hooks
. Versions before 24 did not have change-major-mode-after-body-hook
. When user-implemented major modes do not use run-mode-hooks
and have not been updated to use these newer features, they won’t entirely follow these conventions: they may run the parent’s mode hook too early, or fail to run after-change-major-mode-hook
. If you encounter such a major mode, please correct it to follow these conventions.
When you define a major mode using define-derived-mode
, it automatically makes sure these conventions are followed. If you define a major mode “by hand”, not using define-derived-mode
, use the following functions to handle these conventions automatically.
- Function: run-mode-hooks &rest hookvars
-
Major modes should run their mode hook using this function. It is similar to
run-hooks
(see Hooks), but it also runschange-major-mode-after-body-hook
,hack-local-variables
(when the buffer is visiting a file) (see File Local Variables), andafter-change-major-mode-hook
. The last thing it does is to evaluate any:after-hook
forms declared by parent modes (see Derived Modes).When this function is called during the execution of a
delay-mode-hooks
form, it does not run the hooks orhack-local-variables
or evaluate the forms immediately. Instead, it arranges for the next call torun-mode-hooks
to run them.
- Macro: delay-mode-hooks body…
-
When one major mode command calls another, it should do so inside of
delay-mode-hooks
.This macro executes body, but tells all
run-mode-hooks
calls during the execution of body to delay running their hooks. The hooks will actually run during the next call torun-mode-hooks
after the end of thedelay-mode-hooks
construct.
- Variable: change-major-mode-after-body-hook
This is a normal hook run by
run-mode-hooks
. It is run before the mode hooks.
- Variable: after-change-major-mode-hook
This is a normal hook run by
run-mode-hooks
. It is run at the very end of every properly-written major mode command.
Copyright © 1990-1996, 1998-2021 Free Software Foundation, Inc.
Licensed under the GNU GPL license.
https://www.gnu.org/software/emacs/manual/html_node/elisp/Mode-Hooks.html