Node:kill-rng-yk-ptr last elt, Previous:rotate-yk-ptr remainder, Up:rotate-yk-ptr body
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?)