Emacs Lisp
Emacs Lisp is a dialect of the Lisp programming language used by GNU Emacs. Most of the editing functionality built into Emacs is written in Emacs Lisp, with the remainder being written in C (as is the Lisp interpreter itself). Users of Emacs commonly write Emacs Lisp code to customize and extend Emacs.
Library | lisp-mode |
---|---|
Command | emacs-lisp-mode |
Builtin | yes |
Auto-activates for | *.el, .emacs, _emacs |
Emacs Lisp is also commonly referred to as "elisp" or "Elisp". Files containing Emacs Lisp code use the .el filename suffix; when byte-compiled, the same filename prefix is used but with the .elc filename suffix.
Emacs Lisp is a Lisp-2, which means that a single identifier (in Lisp terminology, "symbol") can simultaneously exist as ("be bound to") both a function and a variable.
Basic setup
You can customize the way Emacs edits and displays this and all other lisp languages with M-x customize-group RET lisp RET.
Helpful keybindings
- [M-TAB]
- Complete at point
- [C-M-q]
- Indent the S-expression following point
- [C-M-x]
- Evaluate the
defun
at point
Common customizations
Outlining
For Org-style outlining, add the following snippet to your Emacs configuration file.
;; Turn on outline minor mode
(add-hook 'emacs-lisp-mode-hook 'outline-minor-mode)
;; Add key bindings for Org-style outline cycling
(add-hook 'outline-minor-mode-hook
(lambda ()
(define-key outline-minor-mode-map [(control tab)] 'org-cycle)
(define-key outline-minor-mode-map [(shift tab)] 'org-global-cycle)))
Now visit any elisp file (say M-x find-library RET outline) and keep pressing [S-TAB] and see what happens. Experiment similarly with [C-TAB].
Indentation
Add the following snippet to your Emacs configuration file, so that you don't have to indent deliberately. See M-x reindent-then-newline-and-indent.
(add-hook 'emacs-lisp-mode-hook
(lambda nil
(local-set-key [(return)] 'reindent-then-newline-and-indent)))
See also Lisp_editing and specially Parinfer for modes that help you keep the indentation (and the parens) automatically balanced.
Always keep parentheses balanced
See Skeleton#Keep some chars always balanced
Scope
By default elisp uses dynamic scope. Since Emacs 24 lexical scope has been added.
To use lexical binding, an Emacs-lisp source file must set a file-variable lexical-binding to t in the file header, e.g., by using a first line like:
;;; -*- lexical-binding: t -*-
See also
elisp-refs - intelligent code search for Emacs Lisp
elisp-refs (in MELPA) can find references to functions, macros or variables. Unlike a dumb text search, elisp-refs actually parses the code, so it's never confused by comments or variables with the same name as functions. This is particularly useful for finding all the places a function is used, or finding examples of usage. Interested readers may enjoy the author's blog post: Searching A Million Lines Of Lisp.
Lisp editing
lisp editing here on wikemacs.
External links
- Emacs Lisp manual
- Programming in elisp, libreplanet.org wiki
- Rules on Elisp coding, on nongnu.org
- Emacs Lisp Style Guide, on Github