current-kill 的代码current-kill 函数被 yank 和 yank-pop 使用。下面是 current-kill 的代码:
(defun current-kill (n &optional do-not-move)
"将插入点在 kill 环中旋转 N 个位置,然后返回该 kill。
如果 N 为零,并且 `interprogram-paste-function' 设置为返回字符串或字符串列表的函数,
并且该函数不返回 nil,则将该字符串(或列表)添加到 kill 环的最前面,并将该字符串
(或列表的第一个字符串)作为最新的 kill 返回。
如果 N 不为零,并且 `yank-pop-change-selection' 为非 nil,则使用
`interprogram-cut-function' 将新的插入点处的 kill 转移到窗口系统的选择中。
如果可选参数 DO-NOT-MOVE 为非 nil,则实际上不移动插入点;只是返回第 N 个 kill。"
(let ((interprogram-paste (and (= n 0)
interprogram-paste-function
(funcall interprogram-paste-function))))
(if interprogram-paste
(progn
;; 在将新文本添加到 kill 环时禁用 interprogram cut 函数,
;; 以便 Emacs 不尝试拥有相同的文本选择。
(let ((interprogram-cut-function nil))
(if (listp interprogram-paste)
(mapc 'kill-new (nreverse interprogram-paste))
(kill-new interprogram-paste)))
(car kill-ring))
(or kill-ring (error "Kill 环为空"))
(let ((ARGth-kill-element
(nthcdr (mod (- n (length kill-ring-yank-pointer))
(length kill-ring))
kill-ring)))
(unless do-not-move
(setq kill-ring-yank-pointer ARGth-kill-element)
(when (and yank-pop-change-selection
(> n 0)
interprogram-cut-function)
(funcall interprogram-cut-function (car ARGth-kill-element))))
(car ARGth-kill-element)))))
还要记住,kill-new 函数将 kill-ring-yank-pointer 设置为 kill 环的最新元素,
这意味着所有调用它的函数都间接地设置了该值:kill-append、copy-region-as-kill、
kill-ring-save、kill-line 和 kill-region。
下面是 kill-new 中的一行,详见 kill-new 函数。
(setq kill-ring-yank-pointer kill-ring)