Go to the first, previous, next, last section, table of contents.


Pointing to the last element

The final question is, what happens if the kill-ring-yank-pointer is set to the last element of the kill ring? Will a call to rotate-yank-pointer mean that nothing more can be taken from the kill ring? The answer is no. What happens is different and useful. The kill-ring-yank-pointer is set to point to the beginning of the kill ring instead.

Let's see how this works by looking at the code, assuming the length of the kill ring is 5 and the argument passed to rotate-yank-pointer is 1. When the kill-ring-yank-pointer points to the last element of the kill ring, its length is 1. The code looks like this:

(% (+ arg (- length (length kill-ring-yank-pointer))) length)

When the variables are replaced by their numeric values, the expression looks like this:

(% (+ 1 (- 5 1)) 5)

This expression can be evaluated by looking at the most embedded inner expression first and working outwards: The value of (- 5 1) is 4; the sum of (+ 1 4) is 5; and the remainder of dividing 5 by 5 is zero. So what rotate-yank-pointer will do is

(setq kill-ring-yank-pointer (nthcdr 0 kill-ring))

which will set the kill-ring-yank-pointer to point to the beginning of the kill ring.

So what happens with successive calls to rotate-yank-pointer is that it moves the kill-ring-yank-pointer from element to element in the kill ring until it reaches the end; then it jumps back to the beginning. And this is why the kill ring is called a ring, since by jumping back to the beginning, it is as if the list has no end! (And what is a ring, but an entity with no end?)


Go to the first, previous, next, last section, table of contents.