Next: Maintaining Undo, Previous: The Kill Ring, Up: Text
Most buffers have an undo list, which records all changes made
to the buffer's text so that they can be undone. (The buffers that
don't have one are usually special-purpose buffers for which Emacs
assumes that undoing is not useful. In particular, any buffer whose
name begins with a space has its undo recording off by default;
see Buffer Names.) All the primitives that modify the
text in the buffer automatically add elements to the front of the undo
list, which is in the variable buffer-undo-list
.
This buffer-local variable's value is the undo list of the current buffer. A value of
t
disables the recording of undo information.
Here are the kinds of elements an undo list can have:
(
beg .
end)
(
text .
position)
(abs
position)
. If position is
positive, point was at the beginning of the deleted text, otherwise it
was at the end. Zero or more (marker . adjustment)
elements follow immediately after this element.
(t .
time-flag)
(
sec-high sec-low microsec
picosec)
represents the visited file's modification time as of
when it was previously visited or saved, using the same format as
current-time
; see Time of Day.
A time-flag of 0 means the buffer does not correspond to any file;
−1 means the visited file previously did not exist.
primitive-undo
uses these
values to determine whether to mark the buffer as unmodified once again;
it does so only if the file's status matches that of time-flag.
(nil
property value beg .
end)
(put-text-property beg end property value)
(
marker .
adjustment)
(apply
funname .
args)
(apply
delta beg end funname .
args)
This kind of element enables undo limited to a region to determine
whether the element pertains to that region.
nil
This function places a boundary element in the undo list. The undo command stops at such a boundary, and successive undo commands undo to earlier and earlier boundaries. This function returns
nil
.Calling this function explicitly is useful for splitting the effects of a command into more than one unit. For example,
query-replace
callsundo-boundary
after each replacement, so that the user can undo individual replacements one by one.Mostly, however, this function is called automatically at an appropriate time.
The editor command loop automatically calls
undo-boundary
just before executing each key sequence, so that each undo normally undoes the effects of one command. A few exceptional commands are amalgamating: these commands generally cause small changes to buffers, so with these a boundary is inserted only every 20th command, allowing the changes to be undone as a group. By default, the commandsself-insert-command
, which produces self-inserting input characters (see Commands for Insertion), anddelete-char
, which deletes characters (see Deletion), are amalgamating. Where a command affects the contents of several buffers, as may happen, for example, when a function on thepost-command-hook
affects a buffer other than thecurrent-buffer
, thenundo-boundary
will be called in each of the affected buffers.
Some buffers, such as process buffers, can change even when no commands are executing. In these cases,
undo-boundary
is normally called periodically by the timer in this variable. Setting this variable to non-nil
prevents this behavior.
This variable is normally
nil
, but the undo commands bind it tot
. This is so that various kinds of change hooks can tell when they're being called for the sake of undoing.
This is the basic function for undoing elements of an undo list. It undoes the first count elements of list, returning the rest of list.
primitive-undo
adds elements to the buffer's undo list when it changes the buffer. Undo commands avoid confusion by saving the undo list value at the beginning of a sequence of undo operations. Then the undo operations use and update the saved value. The new elements added by undoing are not part of this saved value, so they don't interfere with continuing to undo.This function does not bind
undo-in-progress
.