eintr: copy-to-buffer
5.1 The Definition of ‘copy-to-buffer’
======================================
After 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 all the previous
text in the second buffer.
The body of ‘copy-to-buffer’ looks like this,
...
(interactive "BCopy to buffer: \nr")
(let ((oldbuf (current-buffer)))
(with-current-buffer (get-buffer-create buffer)
(barf-if-buffer-read-only)
(erase-buffer)
(save-excursion
(insert-buffer-substring oldbuf start end)))))
The ‘copy-to-buffer’ function has a simpler ‘interactive’ expression
than ‘append-to-buffer’.
The definition then says
(with-current-buffer (get-buffer-create buffer) ...
First, look at the earliest inner expression; that is evaluated
first. That expression starts with ‘get-buffer-create buffer’. The
function tells the computer to use the buffer with the name specified as
the one to which you are copying, or if such a buffer does not exist, to
create it. Then, the ‘with-current-buffer’ function evaluates its body
with that buffer temporarily current.
(This demonstrates another way to shift the computer’s attention but
not the user’s. The ‘append-to-buffer’ function showed how to do the
same with ‘save-excursion’ and ‘set-buffer’. ‘with-current-buffer’ is a
newer, and arguably easier, mechanism.)
The ‘barf-if-buffer-read-only’ function sends you an error message
saying the buffer is read-only if you cannot modify it.
The next line has the ‘erase-buffer’ function as its sole contents.
That function erases the buffer.
Finally, the last two lines contain the ‘save-excursion’ expression
with ‘insert-buffer-substring’ as its body. The
‘insert-buffer-substring’ expression copies the text from the buffer you
are in (and you have not seen the computer shift its attention, so you
don’t know that that buffer is now called ‘oldbuf’).
Incidentally, this is what is meant by “replacement”. To replace
text, Emacs erases the previous text and then inserts new text.
In outline, the body of ‘copy-to-buffer’ looks like this:
(let (BIND-oldbuf-TO-VALUE-OF-current-buffer)
(WITH-THE-BUFFER-YOU-ARE-COPYING-TO
(BUT-DO-NOT-ERASE-OR-COPY-TO-A-READ-ONLY-BUFFER)
(erase-buffer)
(save-excursion
INSERT-SUBSTRING-FROM-oldbuf-INTO-BUFFER)))