eintr: save-restriction
6.1 The ‘save-restriction’ Special Form
=======================================
In Emacs Lisp, you can use the ‘save-restriction’ special form to keep
track of whatever narrowing is in effect, if any. When the Lisp
interpreter meets with ‘save-restriction’, it executes the code in the
body of the ‘save-restriction’ expression, and then undoes any changes
to narrowing that the code caused. If, for example, the buffer is
narrowed and the code that follows ‘save-restriction’ gets rid of the
narrowing, ‘save-restriction’ returns the buffer to its narrowed region
afterwards. In the ‘what-line’ command, any narrowing the buffer may
have is undone by the ‘widen’ command that immediately follows the
‘save-restriction’ command. Any original narrowing is restored just
before the completion of the function.
The template for a ‘save-restriction’ expression is simple:
(save-restriction
BODY... )
The body of the ‘save-restriction’ is one or more expressions that will
be evaluated in sequence by the Lisp interpreter.
Finally, a point to note: when you use both ‘save-excursion’ and
‘save-restriction’, one right after the other, you should use
‘save-excursion’ outermost. If you write them in reverse order, you may
fail to record narrowing in the buffer to which Emacs switches after
calling ‘save-excursion’. Thus, when written together, ‘save-excursion’
and ‘save-restriction’ should be written like this:
(save-excursion
(save-restriction
BODY...))
In other circumstances, when not written together, the
‘save-excursion’ and ‘save-restriction’ special forms must be written in
the order appropriate to the function.
For example,
(save-restriction
(widen)
(save-excursion
BODY...))