How Emacs Chooses a Major Mode
------------------------------
Based on information in the file name or in the file itself, Emacs
automatically selects a major mode for the new buffer when a file is
visited. It also processes local variables specified in the file text.
- Command: fundamental-mode
Fundamental mode is a major mode that is not specialized for
anything in particular. Other major modes are defined in effect
by comparison with this one--their definitions say what to change,
starting from Fundamental mode. The `fundamental-mode' function
does _not_ run any hooks; you're not supposed to customize it.
(If you want Emacs to behave differently in Fundamental mode,
change the _global_ state of Emacs.)
- Command: normal-mode &optional find-file
This function establishes the proper major mode and buffer-local
variable bindings for the current buffer. First it calls
`set-auto-mode', then it runs `hack-local-variables' to parse, and
bind or evaluate as appropriate, the file's local variables.
If the FIND-FILE argument to `normal-mode' is non-`nil',
`normal-mode' assumes that the `find-file' function is calling it.
In this case, it may process a local variables list at the end of
the file and in the `-*-' line. The variable
`enable-local-variables' controls whether to do so. Note:Local
Variables in Files, for the syntax of the
local variables section of a file.
If you run `normal-mode' interactively, the argument FIND-FILE is
normally `nil'. In this case, `normal-mode' unconditionally
processes any local variables list.
`normal-mode' uses `condition-case' around the call to the major
mode function, so errors are caught and reported as a `File mode
specification error', followed by the original error message.
- Function: set-auto-mode
This function selects the major mode that is appropriate for the
current buffer. It may base its decision on the value of the `-*-'
line, on the visited file name (using `auto-mode-alist'), on the
`#!' line (using `interpreter-mode-alist'), or on the file's local
variables list. However, this function does not look for the
`mode:' local variable near the end of a file; the
`hack-local-variables' function does that. Note:How Major Modes
are Chosen.
- User Option: default-major-mode
This variable holds the default major mode for new buffers. The
standard value is `fundamental-mode'.
If the value of `default-major-mode' is `nil', Emacs uses the
(previously) current buffer's major mode for the major mode of a
new buffer. However, if that major mode symbol has a `mode-class'
property with value `special', then it is not used for new buffers;
Fundamental mode is used instead. The modes that have this
property are those such as Dired and Rmail that are useful only
with text that has been specially prepared.
- Function: set-buffer-major-mode buffer
This function sets the major mode of BUFFER to the value of
`default-major-mode'. If that variable is `nil', it uses the
current buffer's major mode (if that is suitable).
The low-level primitives for creating buffers do not use this
function, but medium-level commands such as `switch-to-buffer' and
`find-file-noselect' use it whenever they create buffers.
- Variable: initial-major-mode
The value of this variable determines the major mode of the initial
`*scratch*' buffer. The value should be a symbol that is a major
mode command. The default value is `lisp-interaction-mode'.
- Variable: auto-mode-alist
This variable contains an association list of file name patterns
(regular expressions; Note:Regular Expressions) and
corresponding major mode commands. Usually, the file name
patterns test for suffixes, such as `.el' and `.c', but this need
not be the case. An ordinary element of the alist looks like
`(REGEXP . MODE-FUNCTION)'.
For example,
(("\\`/tmp/fol/" . text-mode)
("\\.texinfo\\'" . texinfo-mode)
("\\.texi\\'" . texinfo-mode)
("\\.el\\'" . emacs-lisp-mode)
("\\.c\\'" . c-mode)
("\\.h\\'" . c-mode)
...)
When you visit a file whose expanded file name (Note:File Name
Expansion) matches a REGEXP, `set-auto-mode' calls the
corresponding MODE-FUNCTION. This feature enables Emacs to select
the proper major mode for most files.
If an element of `auto-mode-alist' has the form `(REGEXP FUNCTION
t)', then after calling FUNCTION, Emacs searches `auto-mode-alist'
again for a match against the portion of the file name that did
not match before. This feature is useful for uncompression
packages: an entry of the form `("\\.gz\\'" FUNCTION t)' can
uncompress the file and then put the uncompressed file in the
proper mode according to the name sans `.gz'.
Here is an example of how to prepend several pattern pairs to
`auto-mode-alist'. (You might use this sort of expression in your
init file.)
(setq auto-mode-alist
(append
;; File name (within directory) starts with a dot.
'(("/\\.[^/]*\\'" . fundamental-mode)
;; File name has no dot.
("[^\\./]*\\'" . fundamental-mode)
;; File name ends in `.C'.
("\\.C\\'" . c++-mode))
auto-mode-alist))
- Variable: interpreter-mode-alist
This variable specifies major modes to use for scripts that
specify a command interpreter in a `#!' line. Its value is a list
of elements of the form `(INTERPRETER . MODE)'; for example,
`("perl" . perl-mode)' is one element present by default. The
element says to use mode MODE if the file specifies an interpreter
which matches INTERPRETER. The value of INTERPRETER is actually a
regular expression.
This variable is applicable only when the `auto-mode-alist' does
not indicate which major mode to use.