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。