Emacs: Set File to Open in a Major Mode

By Xah Lee. Date: . Last updated: .

This page tells you how emacs determine what major mode to load when you open a file, and how you can change the setup.

Associate Major Mode by File Name Extension

Use auto-mode-alist to associate a major mode with file name extension.

;; setup files ending in “.js” to open in js2-mode
(add-to-list 'auto-mode-alist '("\\.js\\'" . js2-mode))

auto-mode-alist is a built-in variable. Its value is a association list. Each key is a regex string, and value is mode name symbol.

[see Elisp: Association List]

Note: in the elisp code above, the double backslash in the string \\.js\\' is used to escape the backslash. So, the regex engine just got \.js\'. The \. is to match a period. The \' is one of emacs special regex syntax, to match end of a string (not including end of a line that's not end of string. End of line is $). (See also: emacs regex tutorial.) (info "(elisp) Regexp Backslash")

You can see the value of auto-mode-alist by Alt+x describe-variable.

Remove File Extension Association

You can remove file name association with a major mode. Example:

;; remove any file name suffix associated with js-mode
(setq auto-mode-alist (rassq-delete-all 'js-mode auto-mode-alist))

To check if a mode is in the list, eval the following and look at the output. (view-echo-area-messages)

;; check if js-mode is in the list.
(rassoc 'js-mode auto-mode-alist)

[see Evaluate Emacs Lisp Code]

Normally, you should not need to remove items in auto-mode-alist. Simply add to the front using add-to-list.

Associate Major Mode by First Line in File

The magic-mode-alist is for associating first line of a file with a mode. (when the line otherwise isn't the unix shebang #!… or embedded elisp variable.) Use it like this:

;; if first line of file matches, activate nxml-mode
(add-to-list 'magic-mode-alist '("<!DOCTYPE html .+DTD XHTML .+>" . nxml-mode) )

The magic-mode-alist is variable. Its value is a list of pairs. The first element is a regex string, the second is a mode name (of type symbol). Emacs tries to match the first line of a file to values in magic-mode-alist. If there's a match, it sets the buffer to that mode.

How Emacs Determines Which Major Mode to Load

Emacs determines what mode to activate by the following mechanisms, in order. If a match is found, the process stops.

  1. Look for a special emacs-specific syntax in the file. For example: if first line in the file contains -*- mode: xyz-*-, emacs will load “xyz-mode”. This is from a general mechanism for emacs to load elisp variables. (See: (info "(emacs) File Variables").) This has the top priority, but this mechanism is not the usual way for programing language files to associate with a major mode.
  2. Check the first line in the file for unix “shebang” syntax (For example, #!/usr/bin/perl) and match it with interpreter-mode-alist.
  3. Trys to match first line text with magic-mode-alist. (As of emacs 24.1.1, by default this list is empty.)
  4. Match the file name with auto-mode-alist.

(info "(emacs) Choosing Modes")

Note that when you install a new package, some has the file association setting code within the package, while others ask you to put a few lines in your emacs init file instead.

Emacs Customization

  1. Emacs init file
  2. Install Packages
  3. Install Package Manually
  4. Define Keys
  5. M-x customize
  6. What's Major Mode?
  7. What's Minor Mode?
  8. Set File to Open in a Major Mode
  9. Organize Init File
  10. Byte Compile Elisp
  11. What's Hook?
  12. Environment Variables in Emacs
  13. Set Default Window Size
  14. Font Setup
  15. Set Color Theme
  16. Turn Off Auto Backup
  17. Check OS, Version, Host Name
  18. Check Defined/Loaded

If you have a question, put $5 at patreon and message me.
Or Buy Xah Emacs Tutorial
Or buy a nice keyboard: Best Keyboards for Emacs


Emacs Lisp