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 (see 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. Examples include Dired mode for buffers made by Dired (see Dired), Message mode for buffers made by C-x m
(see Sending Mail), and Shell mode for buffers used to communicate with an inferior shell process (see Interactive Shell).
Usually, the major mode is automatically set by Emacs, when you first visit a file or create a buffer (see 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 this default value via the Customization interface (see Easy Customization), or by adding a line like this to your init file (see 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 (see Indentation). The keys that are commonly changed are TAB
, DEL
, and C-j
. Many modes also define special commands of their own, usually bound to key sequences whose prefix key is C-c
(see Keys). 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 (see Comments).
To view the documentation for the current major mode, including a list of its key bindings, type C-h m
(describe-mode
). See Misc Help.
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. See 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 (see 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 (see Spelling), and ElDoc minor mode in Emacs Lisp mode (see Lisp Doc):
(add-hook 'text-mode-hook 'flyspell-mode)
(add-hook 'emacs-lisp-mode-hook 'eldoc-mode)
- More specifically, the modes which are “derived" from
prog-mode
(see Derived Modes in The Emacs Lisp Reference Manual).↩