Go to the previous, next section.

The Body of  copy-region-as-kill

The  copy-region-as-kill function is written so that two or more kills in a row combine their text into a single entry. If you yank back the text from the kill ring, you get it all in one piece. Moreover, kills that kill forward from the current position of the cursor are added to the end of the previously copied text and commands that copy text backwards add it to the beginning of the previously copied text. This way, the words in the text stay in the proper order.

The function makes use of two variables that keep track of the current and previous Emacs command. The two variables are  this-command and  last-command .

Normally, whenever a function is executed, Emacs sets the value of  this-command to the function being executed (which in this case would be  copy-region-as-kill ). At the same time, Emacs sets the value of  last-command to the previous value of  this-command . However, the  copy-region-as-kill command is different; it sets the value of  this-command to  kill-region , which is the name of the function that calls  copy-region-as-kill .

In the first part of the body of the  copy-region-as-kill function, an  if expression determines whether the value of  last-command is  kill-region . If so, the then-part of the  if expression is evaluated; it uses the  kill-append function to concatenate the text copied at this call to the function with the text already in the first element (the CAR) of the kill ring. On the other hand, if the value of  last-command is not  kill-region , then the  copy-region-as-kill function attaches a new element to the kill ring.

The  if expression reads as follows; it uses  eq , which is a function we have not yet seen:

(if (eq last-command 'kill-region)
    ;; then-part
    (kill-append (buffer-substring beg end) (< end beg))

The  eq function tests whether its first argument is the same Lisp object as its second argument. The  eq function is similar to the  equal function in that it is used to test for equality, but differs in that it determines whether two representations are actually the same object inside the computer, but with different names.  equal determines whether the structure and contents of two expressions are the same.

Go to the previous, next section.