GNU Emacs Lisp Reference Manual
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.
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.)set-auto-mode, then it runs hack-local-variables to parse, and bind or evaluate as appropriate, any 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.
If you run normal-mode interactively, the argument find-file is normally nil. In this case, normal-mode unconditionally processes any local variables list. See File variables, for the syntax of the local variables section of a file.
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.
t means process the local variables lists unconditionally; nil means ignore them; anything else means ask the user what to do for each file. The default value is t.In addition to this list, any variable whose name has a non-nil risky-local-variable property is also ignored.
Eval:' in local variables lists in files being visited. A value of t means process them unconditionally; nil means ignore them; anything else means ask the user what to do for each file. The default value is maybe.-*-' line, on the visited file name (using auto-mode-alist), or on the value of a local variable. However, this function does not look for the `mode:' local variable near the end of a file; the hack-local-variables function does that. See Choosing Modes.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 the 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.
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.
*scratch*' buffer. The value should be a symbol that is a major mode command name. The default value is lisp-interaction-mode..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 (see 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 match-again feature is useful for uncompression packages: an entry of the form ("\\.gz\\'" . function) 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 `.emacs' file.)
(setq auto-mode-alist
(append
;; File name starts with a dot.
'(("/\\.[^/]*\\'" . fundamental-mode)
;; File name has no dot.
("[^\\./]*\\'" . fundamental-mode)
;; File name ends in `.C'.
("\\.C\\'" . c++-mode))
auto-mode-alist))
!#' 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 interpreter. This variable is applicable only when the auto-mode-alist does not indicate which major mode to use.
The handling of enable-local-variables documented for normal-mode actually takes place here. The argument force usually comes from the argument find-file given to normal-mode.