last-command
和this-command
通常情况下,每当执行函数时,Emacs将this-command
的值设置为正在执行的函数(在本例中将是copy-region-as-kill
)。同时,Emacs将last-command
的值设置为this-command
的先前值。
在copy-region-as-kill
函数的主体的第一部分中,一个if
表达式确定last-command
的值是否为kill-region
。如果是,if
表达式的then-part将被评估;它使用kill-append
函数将此次调用函数时复制的文本与kill环的第一个元素(CAR)中已有的文本连接起来。另一方面,如果last-command
的值不是kill-region
,那么copy-region-as-kill
函数将使用kill-new
函数将一个新元素附加到kill环中。
if
表达式如下所示;它使用eq
:
(if (eq last-command 'kill-region) ;; then-part (kill-append (filter-buffer-substring beg end) (< end beg)) ;; else-part (kill-new (filter-buffer-substring beg end)))
(filter-buffer-substring
函数返回缓冲区的过滤子字符串,如果有的话。可选地——这里没有参数,因此也没有做任何事——该函数可以删除初始文本或返回不带其属性的文本;此函数是较早的buffer-substring
函数的替代,该函数在实现文本属性之前出现。)
eq
函数测试其第一个参数是否与其第二个参数相同的Lisp对象。eq
函数类似于equal
函数,因为它用于测试相等性,但不同之处在于它确定两个表示实际上是计算机内部相同对象,只是具有不同的名称。equal
确定两个表达式的结构和内容是否相同。
如果先前的命令是kill-region
,则Emacs Lisp解释器调用kill-append
函数。