This page is a tutorial on using emacs's default features to edit lisp code, or any text with matching brackets.
Emacs: Auto Highlight Parenthesis: show-paren-mode
Emacs: Insert Parenthesis by Pair: electric-pair-mode
Lisp code with its nested parenthesis syntax represents a tree structure.
Emacs has many commands that are very helpful in moving around nested brackets, analogous to navigating a tree.
(For historical reasons, lisp code are called “sexp”, short for Symbolic EXPression.)
|【Ctrl+Alt+←】||Move to previous sibling|
(move to the (beginning of) previous sexp unit)
|【Ctrl+Alt+→】||Move to next sibling|
(move to the (end of) next sexp unit)
|【Ctrl+Alt+↑】||Move to parent|
(move to the (beginning of) outer paren pair)
|【Ctrl+Alt+↓】||Move to first child|
(move into the (beginning of) first inner paren pair)
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.
(defun fold (f x li) "Applies (f x ele) recursively to the list li …" (let ( (li2 li) (ele) (x2 x) ) (while (setq ele (pop li2)) (setq x2 (funcall f x2 ele)) ) x2 ) )
Place your cursor at the beginning of the left bracket. Now, try to move your cursor, by using ONLY 【Ctrl+Alt+arrow】, to the “pop” , then move it to “let”, then “funcall”.
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:
(a (b) c▮ d (e f))
(a (b) c d (e f)▮)
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.
You can use the command
mark-sexp 【Ctrl+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】.
Emacs: How to Move Cursor Around Source Code Section (^L)
Emacs: Pretty Lambda λ in Emacs 24.4