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)