emacs: Major Modes
23.1 Major Modes
================
Every buffer possesses a major mode, which determines the editing
behavior of Emacs while that buffer is current. The mode line normally
shows the name of the current major mode, in parentheses (Mode
Line).
The least specialized major mode is called “Fundamental mode”. This
mode has no mode-specific redefinitions or variable settings, so that
each Emacs command behaves in its most general manner, and each user
option variable is in its default state.
For editing text of a specific type that Emacs knows about, such as
Lisp code or English text, you typically use a more specialized major
mode, such as Lisp mode or Text mode. Most major modes fall into three
major groups. The first group contains modes for normal text, either
plain or with mark-up. It includes Text mode, HTML mode, SGML mode, TeX
mode and Outline mode. The second group contains modes for specific
programming languages. These include Lisp mode (which has several
variants), C mode, Fortran mode, and others. The third group consists
of major modes that are not associated directly with files; they are
used in buffers created for specific purposes by Emacs, such as Dired
mode for buffers made by Dired (Dired), Message mode for buffers
made by ‘C-x m’ (Sending Mail), and Shell mode for buffers used
to communicate with an inferior shell process (Interactive
Shell).
Usually, the major mode is automatically set by Emacs, when you first
visit a file or create a buffer (Choosing Modes). You can
explicitly select a new major mode by using an ‘M-x’ command. Take the
name of the mode and add ‘-mode’ to get the name of the command to
select that mode (e.g., ‘M-x lisp-mode’ enters Lisp mode). Since every
buffer has exactly one major mode, there is no way to “turn off” a major
mode; instead you must switch to a different one.
The value of the buffer-local variable ‘major-mode’ is a symbol with
the same name as the major mode command (e.g., ‘lisp-mode’). This
variable is set automatically; you should not change it yourself.
The default value of ‘major-mode’ determines the major mode to use
for files that do not specify a major mode, and for new buffers created
with ‘C-x b’. Normally, this default value is the symbol
‘fundamental-mode’, which specifies Fundamental mode. You can change
DONTPRINTYET this default value via the Customization interface (Easy
Customization), or by adding a line like this to your init file (*note Init File::):
(setq-default major-mode 'text-mode)
If the default value of ‘major-mode’ is ‘nil’, the major mode is taken
from the previously current buffer.
Specialized major modes often change the meanings of certain keys to
do something more suitable for the mode. For instance, programming
language modes bind <TAB> to indent the current line according to the
rules of the language (Indentation). The keys that are commonly
changed are <TAB>, <DEL>, and ‘C-j’. Many modes also define special
commands of their own, usually bound in the prefix key ‘C-c’. Major
modes can also alter user options and variables; for instance,
programming language modes typically set a buffer-local value for the
variable ‘comment-start’, which determines how source code comments are
delimited (Comments).
To view the documentation for the current major mode, including a
list of its key bindings, type ‘C-h m’ (‘describe-mode’).
Every major mode, apart from Fundamental mode, defines a “mode hook”,
a customizable list of Lisp functions to run each time the mode is
enabled in a buffer. Hooks, for more information about hooks.
Each mode hook is named after its major mode, e.g., Fortran mode has
‘fortran-mode-hook’. Furthermore, all text-based major modes run
‘text-mode-hook’, and many programming language modes (1) (including all
those distributed with Emacs) run ‘prog-mode-hook’, prior to running
their own mode hooks. Hook functions can look at the value of the
variable ‘major-mode’ to see which mode is actually being entered.
Mode hooks are commonly used to enable minor modes (Minor
Modes). For example, you can put the following lines in your init
file to enable Flyspell minor mode in all text-based major modes (
Spelling), and Eldoc minor mode in Emacs Lisp mode (Lisp Doc):
(add-hook 'text-mode-hook 'flyspell-mode)
(add-hook 'emacs-lisp-mode-hook 'eldoc-mode)
---------- Footnotes ----------
(1) More specifically, the modes which are ”derived” from ‘prog-mode’
((elisp)Derived Modes).