last-commandthis-command

通常,每当函数执行时,Emacs 都会将 this-command 设置为当前执行的函数 (此处即为 copy-region-as-kill)。 同时,Emacs 会将 last-command 设置为 this-command 之前的值。

copy-region-as-kill 函数体开头, 一个 if 表达式判断 last-command 是否为 kill-region。若是, 则执行 if 的 then 分支:调用 kill-append 将本次复制的文本与删除环第一个元素(CAR) 中的已有文本拼接。反之,若 last-command 不是 kill-region,则 copy-region-as-kill 通过 kill-new 向删除环添加一个新元素。

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 对象。 eqequal 类似,都用于判断相等, 但区别在于:eq 判断两个表示是否为计算机内 完全相同的对象(仅名称不同); 而 equal 判断两个表达式的结构与内容是否相同。

若上一条命令是 kill-region, Emacs Lisp 解释器就会调用 kill-append 函数。