10.2 kill-ring-yank-pointer 变量

kill-ring-yank-pointer 是一个变量, 就像 kill-ring 一样。 它和其他 Lisp 变量一样,通过绑定到目标值来实现指向。

例如,如果删除环的值为:

("some text" "a different piece of text" "yet more text")

kill-ring-yank-pointer 指向第二个元素, 那么 kill-ring-yank-pointer 的值为:

("a different piece of text" "yet more text")

正如上一章所述(see 列表的实现方式), 计算机并不会为 kill-ringkill-ring-yank-pointer 分别保存文本副本。 “a different piece of text”和 “yet more text” 并不会被重复存储。相反,两个 Lisp 变量指向同一段文本。 示意图如下:

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



变量 kill-ringkill-ring-yank-pointer 都是指针。但通常描述删除环时,会直接把它当成其构成的列表本身, 即把 kill-ring 当作列表,而非指向列表的指针。 相反,kill-ring-yank-pointer 则明确被描述为指向某个列表。

这两种表述方式初看令人困惑,仔细思考后便会清晰。 删除环一般被视为保存近期被剪切文本的完整数据结构; 而 kill-ring-yank-pointer 的作用是标记 — 也就是指向 — 删除环中即将被插入的起始位置(即 CAR 位置)。