Go to the previous, next section.


The  copy-region-as-kill function copies a region of text from a buffer and saves it in a variable called the  kill-ring .

If you call  copy-region-as-kill immediately after a  kill-region command, Emacs appends the newly copied text to the previously copied text. This means that if you yank back the text, you get it all, from both this and the previous operation. On the other hand, if some other command precedes the  copy-region-as-kill , the function copies the text into a separate entry in the kill ring.

Here is the complete text of the version 18  copy-region-as-kill , formatted for clarity with several comments added:

(defun copy-region-as-kill (beg end)
  "Save the region as if killed, but don't kill it."
  (interactive "r")

  (if (eq last-command 'kill-region)

      ;; then-part: Combine newly copied text
      ;;   with previously copied text.
      (kill-append (buffer-substring beg end) (< end beg))

    ;; else-part: Add newly copied text as a new element
    ;;   to the kill ring and shorten the kill ring if necessary.
    (setq kill-ring
          (cons (buffer-substring beg end) kill-ring))
    (if (> (length kill-ring) kill-ring-max) 
        (setcdr (nthcdr (1- kill-ring-max) kill-ring) nil)))

  (setq this-command 'kill-region)
  (setq kill-ring-yank-pointer kill-ring))

As usual, this function can be divided into its component parts:

(defun copy-region-as-kill (argument-list)
  (interactive "r")

The arguments are  beg and  end and the function is interactive with  "r" , so the two arguments must refer to the beginning and end of the region. If you have been reading though this document from the beginning, understanding these parts of a function is almost becoming routine.

The documentation is somewhat confusing unless you remember that the word `kill' has a meaning different from its usual meaning.

The body of the function starts with an  if clause. What this clause does is distinguish between two different situations: whether or not this command is executed immediately after a previous  kill-region command. In the first case, the new region is appended to the previously copied text. Otherwise, it is inserted into the beginning of the kill ring as a separate piece of text from the previous piece.

The last two lines of the function are two  setq expressions. One of them sets the variable  this-command to  kill-region and the other sets the variable  kill-ring-yank-pointer to point to the kill ring.

The body of  copy-region-as-kill merits discussion in detail.

Go to the previous, next section.