Elisp: How to Name Your Major Mode
This page is a tutorial on how to name your own major mode.
First, here's a quick summary.
There are several names associated with a major mode:
- The command name to invokes the mode (For example,
- Buffer local variable major-mode.
- Buffer local variable mode-name.
- Feature name, e.g. the xyz in
- File name of the source code. e.g. “xyz-mode.el”.
Here's a quick guide.
First, think of a prefix name. Let's say “mymath” for a math oriented programing language.
- For ALL symbols in your source code (that is, variable names and function names), they should start with “mymath-”
- The file name should be “mymath-mode.el”
- The command name to invoke the mode should be “mymath-mode”
- The package's feature name should be “mymath”. That is,
If you follow the above guide, it'd be much easier to submit your package to package repo such as MELPA. [see Emacs: How to Install Packages Using ELPA, MELPA]
Value of Variable “major-mode”
major-mode is a built-in buffer local variable.
For example, Alt+x
describe-variable then type “major-mode”, and
emacs will show the variable's value of the current buffer's major mode.
This variable is the most important, technical, name for a major
mode. This value is usually the same as the command name user types to activate the mode, but not always. (for example, the command to invoke
This variable is automatically set when you use
define-derived-mode. Emacs will use the first argument as the value.
Value of Feature Name
This is also a important technical name. Feature symbol is most similar to other language's package/module name for import/load.
Choosing Your Mode's Name
When choosing a name, try to come up with a name so that user can tell what it is for, but also unique from other modes for the same language. For example, if your mode is for HTML, you don't want just name it
html-mode, because many other people probably have created a mode of the same name, causing confusion and name conflict.
- Do not name it like “david-mode”, or “great-mode”, because user won't be able to tell what it is for.
- Do not name it generic like html-mode or ruby-mode, since a lot other lisp programers might also wrote those modes. Only modes distributed with GNU Emacs might want to use such a generic name.
Here are some example names from existing modes for consideration:
- For Perl, there are modes named perl-mode, cperl-mode.
- For XML, there are modes named xml-mode and nxml-mode.
- For HTML, there are html-mode, html-helper-mode, nxhtml-mode.
- For IRC, there are rcirc-mode, erc-mode.
- For email, there's rmail, vm, gnus.
If you are out of ideas, you can simply name it with your name plus the language's name, such as “dv-html-mode”.
Prefix Mode Name to All Names
Emacs lisp does not have namespace. Basically, all variables and functions are all in a global namespace, stored in the variable obarray.
The symbols in your package should have unique names to avoid multiple packages having the same name that can override each other. The conventional practice is that all your symbol's names in your mode should be prefixed by your mode name, or a abbreviation of your mode name.
This is also important reason that you should choose a unique name for your mode.
For example, if you look at the source code of
cperl-mode, all their names starts with “cperl-”. For
python-mode, all names starts with “python-”.
Value of Variable “mode-name”
mode-name is a built-in buffer local variable. When in a major mode, the value of the variable mode-name is displayed in the status bar (the “mode line”). This name is intended to be human friendly indication of what language they are working with.
- in html-mode, the value is “HTML”.
- In perl-mode, the value is “Perl”.
- In cperl-mode, the value is “CPerl”.
- In nxml-mode, the value “nXML”.
If you use
define-derived-mode, the 3rd arg will automatically be set as the mode-name.
(define-derived-mode dv-html-mode fundamental-mode "dvHTML" … )
Else, you can set it yourself.
(setq mode-name "HTML")
The Elisp File Name
Emacs and Elisp does not enforce a relation of your mode's name and the file name. For example, your can have your mode named “mymath-mode”, while the file name can be “math_mode_by_David.el” or “math_mode_v1.4.el”.
Normally, you just name your file the same as the value of the variable major-mode defined in your package. So, for example, if you have “mymath-mode”, then the file can be “mymath-mode.el”. This is how majority of major mode package's files are named.
Elisp file's name can be a little flexible. A version number in the file name is common. If your package has more than one file, you can name them anything appropriate to the file's purpose.
What's the difference between library, package, features? And what's the difference between load-file, load, require, autoload?
Writing Major Mode
- How to Write a Emacs Major Mode for Syntax Coloring
- Elisp: html6-mode
- Elisp: Font Lock Mode Basics
- Elisp: How to Define Face
- Elisp: How to Color Comment in Major Mode
- Elisp: How to Write Comment Command in Major Mode
- Elisp: How to Write Your Own Comment Command from Scratch
- Elisp: How to Write Keyword Completion Command
- Elisp: How to Create Keymap for Major Mode
- Elisp: Create Abbrev and Templates for Major Mode
- Elisp: Text Properties
- Elisp: Overlay Highlighting
- Emacs: Lookup Google, Dictionary, Documentation
- Elisp: Syntax Table Tutorial
Patreon me $5. Ask me question on patreon