The final question is, what happens if the
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.
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.
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.