copy-region-as-kill函数的完整定义

以下是版本22的copy-region-as-kill函数的完整文本:

(defun copy-region-as-kill (beg end)
  "将区域保存为已杀死,但不要杀死它。
在瞬时标记模式下,取消激活标记。
如果`interprogram-cut-function'非空,还为窗口系统剪切和粘贴保存文本。"
  (interactive "r")
  (if (eq last-command 'kill-region)
      (kill-append (filter-buffer-substring beg end) (< end beg))
    (kill-new (filter-buffer-substring beg end)))
  (if transient-mark-mode
      (setq deactivate-mark t))
  nil)

像往常一样,此函数可以分为其组成部分:

(defun copy-region-as-kill (argument-list)
  "documentation…"
  (interactive "r")
  body…)

参数是begend,函数以"r"交互,因此两个参数必须引用区域的起始和结束。如果您从文档开头阅读到这里,理解函数的这些部分几乎变得很常规。

文档有点令人困惑,除非您记得“kill”一词的意义与通常不同。瞬时标记和interprogram-cut-function的注释解释了某些副作用。

一旦设置了标记,缓冲区始终包含一个区域。如果愿意,可以使用瞬时标记模式临时突出显示区域。 (没有人希望一直突出显示区域,因此瞬时标记模式仅在适当的时候突出显示。许多人关闭瞬时标记模式,因此区域永远不会被突出显示。)

此外,窗口系统允许在不同程序之间复制、剪切和粘贴。例如,在X窗口系统中,interprogram-cut-function函数是x-select-text,它与窗口系统的Emacs kill环的等价物一起工作。

copy-region-as-kill函数的主体以一个if子句开始。该子句的作用是区分两种不同的情况:是否立即在先前的kill-region命令之后执行此命令。在第一种情况下,新区域将附加到先前复制的文本。否则,它将作为一个独立的文本片段插入到kill环的开头。

函数的最后两行阻止区域在瞬时标记模式打开时突出显示。