elisp: Maintaining Undo
31.10 Maintaining Undo Lists
============================
This section describes how to enable and disable undo information for a
given buffer. It also explains how the undo list is truncated
automatically so it doesn’t get too big.
Recording of undo information in a newly created buffer is normally
enabled to start with; but if the buffer name starts with a space, the
undo recording is initially disabled. You can explicitly enable or
disable undo recording with the following two functions, or by setting
‘buffer-undo-list’ yourself.
-- Command: buffer-enable-undo &optional buffer-or-name
This command enables recording undo information for buffer
BUFFER-OR-NAME, so that subsequent changes can be undone. If no
argument is supplied, then the current buffer is used. This
function does nothing if undo recording is already enabled in the
buffer. It returns ‘nil’.
In an interactive call, BUFFER-OR-NAME is the current buffer. You
cannot specify any other buffer.
-- Command: buffer-disable-undo &optional buffer-or-name
This function discards the undo list of BUFFER-OR-NAME, and
disables further recording of undo information. As a result, it is
no longer possible to undo either previous changes or any
subsequent changes. If the undo list of BUFFER-OR-NAME is already
disabled, this function has no effect.
In an interactive call, BUFFER-OR-NAME is the current buffer. You
cannot specify any other buffer. This function returns ‘nil’.
As editing continues, undo lists get longer and longer. To prevent
them from using up all available memory space, garbage collection trims
them back to size limits you can set. (For this purpose, the size of an
undo list measures the cons cells that make up the list, plus the
strings of deleted text.) Three variables control the range of
acceptable sizes: ‘undo-limit’, ‘undo-strong-limit’ and
‘undo-outer-limit’. In these variables, size is counted as the number
of bytes occupied, which includes both saved text and other data.
-- User Option: undo-limit
This is the soft limit for the acceptable size of an undo list.
The change group at which this size is exceeded is the last one
kept.
-- User Option: undo-strong-limit
This is the upper limit for the acceptable size of an undo list.
The change group at which this size is exceeded is discarded itself
(along with all older change groups). There is one exception: the
very latest change group is only discarded if it exceeds
‘undo-outer-limit’.
-- User Option: undo-outer-limit
If at garbage collection time the undo info for the current command
exceeds this limit, Emacs discards the info and displays a warning.
This is a last ditch limit to prevent memory overflow.
-- User Option: undo-ask-before-discard
If this variable is non-‘nil’, when the undo info exceeds
‘undo-outer-limit’, Emacs asks in the echo area whether to discard
the info. The default value is ‘nil’, which means to discard it
automatically.
This option is mainly intended for debugging. Garbage collection
is inhibited while the question is asked, which means that Emacs
might leak memory if the user waits too long before answering the
question.