33.8.6 剪切环内部实现

变量 kill-ring 保存剪切环内容,形式为字符串列表。 最新剪切的内容始终位于列表首部。

变量 kill-ring-yank-pointer 指向剪切环列表中的一个链,其 CAR 即为下一次要粘贴的文本。我们称其标识了环的首部。将 kill-ring-yank-pointer 移动到其他链称为旋转剪切环(rotating the kill ring)。将剪切环称为 “环(ring)”,是因为移动粘贴指针的函数 会在列表首尾之间循环。剪切环的旋转是虚拟的,不会改变 kill-ring 的值。

kill-ringkill-ring-yank-pointer 均为 Lisp 变量, 其值通常为列表。kill-ring-yank-pointer 名称中的 “指针(pointer)” 一词表明, 该变量的作用是标识列表中供下一次粘贴命令使用的元素。

kill-ring-yank-pointer 的值始终与剪切环列表中的某条链 eq 等价。 它所指向的元素即为该链的 CAR。修改剪切环的剪切命令同时会将该变量 设为 kill-ring 的值,效果是旋转环使新剪切的文本位于首部。

下图展示了变量 kill-ring-yank-pointer 指向剪切环 ("some text" "a different piece of text" "yet older text") 中第二个条目的状态。

kill-ring                  ---- kill-ring-yank-pointer
  |                       |
  |                       v
  |     --- ---          --- ---      --- ---
   --> |   |   |------> |   |   |--> |   |   |--> nil
        --- ---          --- ---      --- ---
         |                |            |
         |                |            |
         |                |             -->"yet older text"
         |                |
         |                 --> "a different piece of text"
         |
          --> "some text"

这种状态通常出现在执行 C-yyank)后紧接着执行 M-yyank-pop)时。

Variable: kill-ring

该变量保存剪切文本序列列表,最新剪切内容在前。

Variable: kill-ring-yank-pointer

该变量的值指明剪切环中哪一个元素作为粘贴操作的首部。更精确地说, 其值是 kill-ring 值的一个尾部,其 CAR 即为 C-y 应当粘贴的剪切字符串。

User Option: kill-ring-max

该变量的值为剪切环可增长的最大长度,超出后会从末尾丢弃元素。 kill-ring-max 的默认值为 120。