Node:copy-to-buffer, Next:insert-buffer, Previous:More Complex, Up:More Complex
copy-to-bufferAfter understanding how append-to-buffer works, it is easy to
understand copy-to-buffer. This function copies text into a
buffer, but instead of adding to the second buffer, it replaces the
previous text in the second buffer. The code for the
copy-to-buffer function is almost the same as the code for
append-to-buffer, except that erase-buffer and a second
save-excursion are used. (See The Definition of append-to-buffer, for the description of
append-to-buffer.)
The body of copy-to-buffer looks like this
...
(interactive "BCopy to buffer: \nr")
(let ((oldbuf (current-buffer)))
(save-excursion
(set-buffer (get-buffer-create buffer))
(erase-buffer)
(save-excursion
(insert-buffer-substring oldbuf start end)))))
This code is similar to the code in append-to-buffer: it is
only after changing to the buffer to which the text will be copied
that the definition for this function diverges from the definition for
append-to-buffer: the copy-to-buffer function erases the
buffer's former contents. (This is what is meant by `replacement'; to
replace text, Emacs erases the previous text and then inserts new
text.) After erasing the previous contents of the buffer,
save-excursion is used for a second time and the new text is
inserted.
Why is save-excursion used twice? Consider again what the
function does.
In outline, the body of copy-to-buffer looks like this:
(let (bind-oldbuf-to-value-of-current-buffer) (save-excursion ; First use ofsave-excursion. change-buffer (erase-buffer) (save-excursion ; Second use ofsave-excursion. insert-substring-from-oldbuf-into-buffer)))
The first use of save-excursion returns Emacs to the buffer from
which the text is being copied. That is clear, and is just like its use
in append-to-buffer. Why the second use? The reason is that
insert-buffer-substring always leaves point at the end of
the region being inserted. The second save-excursion causes
Emacs to leave point at the beginning of the text being inserted. In
most circumstances, users prefer to find point at the beginning of
inserted text. (Of course, the copy-to-buffer function returns
the user to the original buffer when done--but if the user then
switches to the copied-to buffer, point will go to the beginning of the
text. Thus, this use of a second save-excursion is a little
nicety.)