How to Edit Lisp Code with Emacs

Buy Xah Emacs Tutorial. Master emacs benefits for life.
, , …,

This page is a tutorial on using emacs's default features to edit lisp code, or any text with matching brackets.

Highlight Text Selection

Put the following code in your emacs init file:

;; highlight text selection (on by default since emacs 23.2)
(transient-mark-mode 1)

;; make typing overwrite text selection
(delete-selection-mode 1)

Auto Highlight Parenthesis: show-paren-mode

show-paren-mode will highlight matching brackets when your cursor is on one of the bracket.

;; turn on highlight matching brackets when cursor is on one
(show-paren-mode 1)

show-paren-mode has 2 styles of highlighting brackets.

emacs show-paren-mode 1
Highligh just the brackets.
emacs show-paren-mode 2
Highligh the whole expression.

By default, emacs highlights just the brackets. You can change it with the following code:

(setq show-paren-style 'parenthesis) ; highlight just brackets
(setq show-paren-style 'expression) ; highlight entire bracket expression

Note: show-paren-mode will highlight any brackets, including () [] {} 「」 『』 【】 〖〗 〈〉 《》 ‹› «» …. 〔➤ Matching Brackets in Unicode

Inserting Brackets by Pairs

Call electric-pair-mode (new in emacs 24. 〔➤ New Features in Emacs 24.1〕).

;; turn on automatic bracket insertion by pairs. New in emacs 24
(electric-pair-mode 1)

For detail and alternative solutions, see: Emacs: Insert Brackets by Pair.

Navigating Nested Code

Lisp code with its nested parenthesis syntax represents a tree structure. Emacs has several commands that are very helpful in moving around nested syntax, analogous to navigating a tree. The following is a table showing the names, keys, and purpose. (For historical reasons, lisp code units are sometimes called “sexp”, short for Symbolic EXPression.)

emacs lisp code navigation commands
Ctrl+Alt+backward-sexpMove to previous sibling
(move to the (beginning of) previous sexp unit)
Ctrl+Alt+forward-sexpMove to next sibling
(move to the (end of) next sexp unit)
Ctrl+Alt+backward-up-listMove to parent
(move to the (beginning of) outer paren pair)
Ctrl+Alt+down-listMove to first child
(move into the (beginning of) first inner paren pair)

(You can define simpler keys for them. For example, single key press on your number pad keys. 〔➤ Emacs: How to Define Keys〕)

The following is lisp source code laid out in a way to show its tree structure. You should try the above commands on it. It is very helpful to understand how sexp corresponds to a tree, and how the commands move the cursor exactly.

  (f x li)
  "Applies (f x ele) recursively to the list li …"
      (li2 li)
      (x2 x)
      (setq ele (pop li2))
      (setq x2 (funcall f x2 ele))

Place your cursor at the beginning of the left bracket. Now, try to move your cursor, by using ONLY 【Ctrl+Alt+‹arrows›】, to the pop, then move it to let, then funcall.

Moving to Previous/Next Sibling that Has Children

Use backward-list and forward-list to jump to prev/next sibling that has children. (i.e. skip siblings that does not have children.)

For example, suppose you have (a (b) ▮ c d (e f)) and your cursor is before “c”. Then:

Freely Moving Cursor to Brackets

It's also very convenient to have keys that moves to any prev/next opening/closing bracket characters, without regarding the tree structure. See: Emacs: Commands to Move Cursor by Brackets, Quotes.

Selecting a Sexp Unit

You can use the command mark-sexpCtrl+Alt+Space】 to select a complete sexp. Your cursor must be on the left bracket.

To select a complete sexp, type 【Ctrl+Alt+】 then 【Ctrl+Alt+Space】.

Change Paren Match Background Color

emacs 24.3 customize-face screen 2014-03-10
emacs 24.3 customize-face screen

You can change the default background color for highlighting the paren. Call customize-face, then type “show-paren-match”. Change settings, click the button “Apply and Save” at the top. This will save the lisp code in your emacs init file. For example, the following shows in my emacs init file:

  ;; custom-set-faces was added by Custom.
  ;; If you edit it by hand, you could mess it up, so be careful.
  ;; Your init file should contain only one such instance.
  ;; If there is more than one, they won't work right.
 '(show-paren-match ((((class color) (background light)) (:background "azure2")))))

To see a list of available colors and their names, call list-colors-display.

Backward/Forward Code Section

Emacs: How to Move Cursor Around Source Code Section (^L)

Show lambda as λ

Emacs: Pretty Lambda λ in Emacs 24.4

Like it?
Buy Xah Emacs Tutorial
or share
blog comments powered by Disqus