define-minor-mode offers a convenient way of
implementing a mode in one self-contained definition.
This macro defines a new minor mode whose name is mode (a symbol). It defines a command named mode to toggle the minor mode, with doc as its documentation string. It also defines a variable named mode, which is set to
nilby enabling or disabling the mode. The variable is initialized to init-value. Except in unusual circumstances (see below), this value must be
The string lighter says what to display in the mode line when the mode is enabled; if it is
nil, the mode is not displayed in the mode line.
The optional argument keymap specifies the keymap for the minor mode. If non-
nil, it should be a variable name (whose value is a keymap), a keymap, or an alist of the form(key-sequence . definition)
where each key-sequence and definition are arguments suitable for passing to
define-key(see Changing Key Bindings). If keymap is a keymap or an alist, this also defines the variable mode
The above three arguments init-value, lighter, and keymap can be (partially) omitted when keyword-args are used. The keyword-args consist of keywords followed by corresponding values. A few keywords have special meanings:
- Custom group name to use in all generated
defcustomforms. Defaults to mode without the possible trailing ‘-mode’. Warning: don't use this default group name unless you have written a
defgroupto define that group properly. See Group Definitions.
- If non-
nil, this specifies that the minor mode should be global rather than buffer-local. It defaults to
One of the effects of making a minor mode global is that the mode variable becomes a customization variable. Toggling it through the Custom interface turns the mode on and off, and its value can be saved for future Emacs sessions (see Saving Customizations. For the saved variable to work, you should ensure that the
define-minor-modeform is evaluated each time Emacs starts; for packages that are not part of Emacs, the easiest way to do this is to specify a
- This is equivalent to specifying init-value positionally.
- This is equivalent to specifying lighter positionally.
- This is equivalent to specifying keymap positionally.
Any other keyword arguments are passed directly to the
defcustomgenerated for the variable mode.
The command named mode first performs the standard actions such as setting the variable named mode and then executes the body forms, if any. It finishes by running the mode hook variable mode
The initial value must be
nil except in cases where (1) the
mode is preloaded in Emacs, or (2) it is painless for loading to
enable the mode even though the user did not request it. For
instance, if the mode has no effect unless something else is enabled,
and will always be loaded by that time, enabling it by default is
harmless. But these are unusual circumstances. Normally, the
initial value must be
easy-mmode-define-minor-mode is an alias
for this macro.
Here is an example of using
(define-minor-mode hungry-mode "Toggle Hungry mode. With no argument, this command toggles the mode. Non-null prefix argument turns on the mode. Null prefix argument turns off the mode. When Hungry mode is enabled, the control delete key gobbles all preceding whitespace except the last. See the command \\[hungry-electric-delete]." ;; The initial value. nil ;; The indicator for the mode line. " Hungry" ;; The minor mode bindings. '(([C-backspace] . hungry-electric-delete)) :group 'hunger)
This defines a minor mode named “Hungry mode,” a command named
hungry-mode to toggle it, a variable named
which indicates whether the mode is enabled, and a variable named
hungry-mode-map which holds the keymap that is active when the
mode is enabled. It initializes the keymap with a key binding for
C-<DEL>. It puts the variable
hunger. There are no body forms—many
minor modes don't need any.
Here's an equivalent way to write it:
(define-minor-mode hungry-mode "Toggle Hungry mode. With no argument, this command toggles the mode. Non-null prefix argument turns on the mode. Null prefix argument turns off the mode. When Hungry mode is enabled, the control delete key gobbles all preceding whitespace except the last. See the command \\[hungry-electric-delete]." ;; The initial value. :init-value nil ;; The indicator for the mode line. :lighter " Hungry" ;; The minor mode bindings. :keymap '(([C-backspace] . hungry-electric-delete) ([C-M-backspace] . (lambda () (interactive) (hungry-electric-delete t)))) :group 'hunger)
This defines a global toggle named global-mode whose meaning is to enable or disable the buffer-local minor mode mode in all buffers. To turn on the minor mode in a buffer, it uses the function turn-on; to turn off the minor mode, it calls
modewith −1 as argument.
Globally enabling the mode also affects buffers subsequently created by visiting files, and buffers that use a major mode other than Fundamental mode; but it does not detect the creation of a new buffer in Fundamental mode.
This defines the customization option global-mode (see Customization), which can be toggled in the Custom interface to turn the minor mode on and off. As with
define-minor-mode, you should ensure that the
define-globalized-minor-modeform is evaluated each time Emacs starts, for example by providing a
:groupgroup in keyword-args to specify the custom group for the mode variable of the global minor mode.