prev UP NEXT GNU Emacs Lisp Reference Manual

20.2.1: Conventions for Writing Minor Modes

There are conventions for writing minor modes just as there are for major modes. Several of the major mode conventions apply to minor modes as well: those regarding the name of the mode initialization function, the names of global symbols, and the use of keymaps and other tables.

In addition, there are several conventions that are specific to minor modes.

  • Make a variable whose name ends in `-mode' to represent the minor mode. Its value should enable or disable the mode (nil to disable; anything else to enable.) We call this the mode variable.

    This variable is used in conjunction with the minor-mode-alist to display the minor mode name in the mode line. It can also enable or disable a minor mode keymap. Individual commands or hooks can also check the variable's value.

    If you want the minor mode to be enabled separately in each buffer, make the variable buffer-local.

  • Define a command whose name is the same as the mode variable. Its job is to enable and disable the mode by setting the variable.

    The command should accept one optional argument. If the argument is nil, it should toggle the mode (turn it on if it is off, and off if it is on). Otherwise, it should turn the mode on if the argument is a positive integer, a symbol other than nil or -, or a list whose CAR is such an integer or symbol; it should turn the mode off otherwise.

    Here is an example taken from the definition of transient-mark-mode. It shows the use of transient-mark-mode as a variable that enables or disables the mode's behavior, and also shows the proper way to toggle, enable or disable the minor mode based on the raw prefix argument value.

    (setq transient-mark-mode
          (if (null arg) (not transient-mark-mode)
            (> (prefix-numeric-value arg) 0)))
    
  • Add an element to minor-mode-alist for each minor mode (see Mode Line Variables). This element should be a list of the following form:
    (mode-variable string)
    

    Here mode-variable is the variable that controls enabling of the minor mode, and string is a short string, starting with a space, to represent the mode in the mode line. These strings must be short so that there is room for several of them at once.

    When you add an element to minor-mode-alist, use assq to check for an existing element, to avoid duplication. For example:

    (or (assq 'leif-mode minor-mode-alist)
        (setq minor-mode-alist
              (cons '(leif-mode " Leif") minor-mode-alist)))