current-kill 函数体

函数定义体是一个 let 表达式,它本身有一个体和一个 varlist

let 表达式声明了一个仅在此函数范围内可用的变量。这个变量称为 interprogram-paste,用于复制到另一个程序,而不是在此 GNU Emacs 实例内进行复制。大多数窗口系统提供了跨程序粘贴的功能。遗憾的是,这个功能通常只提供最后一个元素。尽管 Emacs 几十年来一直提供了许多可能性的环形,但大多数窗口系统尚未采用。

if 表达式有两个部分,一个是如果存在 interprogram-paste,另一个是如果不存在。

让我们考虑 current-kill 函数的 else-部分。(then-部分使用我们已经描述的 kill-new 函数。See kill-new 函数.)

(or kill-ring (error "Kill ring is empty"))
(let ((ARGth-kill-element
       (nthcdr (mod (- n (length kill-ring-yank-pointer))
                    (length kill-ring))
               kill-ring)))
  (or do-not-move
      (setq kill-ring-yank-pointer ARGth-kill-element))
  (car ARGth-kill-element))

代码首先检查 kill 环是否有内容;否则,它会发出一个错误。

请注意,or 表达式与使用 if 测试长度非常相似:

(if (zerop (length kill-ring))          ; if-部分
    (error "Kill ring is empty"))       ; then-部分
  ;; 没有 else-部分

如果 kill 环中没有任何内容,它的长度必须为零,并向用户发送错误消息:‘Kill ring is empty’。current-kill 函数使用一个更简单的 or 表达式。但是,一个 if 表达式提醒我们发生了什么。

if 表达式使用函数 zerop,如果它测试的值为零,则返回 true。当 zerop 测试为 true 时,if 的 then-部分将被评估。then-部分是以函数 error 开头的列表,它是一种类似于 message 函数的函数 (see The message Function),因为它在回显区域打印一行消息。然而,除了打印消息之外,error 还会停止它嵌套在其中的函数的评估。这意味着如果 kill 环的长度为零,则函数的其余部分将不会被评估。

然后,current-kill 函数选择要返回的元素。选择取决于 current-kill 旋转的位置以及 kill-ring-yank-pointer 指向的位置。

接下来,如果可选的 do-not-move 参数为 true,或者当前值 kill-ring-yank-pointer 被设置为指向列表。最后,另一个表达式返回列表的第一个元素,即使 do-not-move 参数为 true。