current-kill 的代码

current-kill 函数被 yankyank-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-appendcopy-region-as-killkill-ring-savekill-linekill-region

下面是 kill-new 中的一行,详见 kill-new 函数

(setq kill-ring-yank-pointer kill-ring)