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…)
参数是beg
和end
,函数以"r"
交互,因此两个参数必须引用区域的起始和结束。如果您从文档开头阅读到这里,理解函数的这些部分几乎变得很常规。
文档有点令人困惑,除非您记得“kill”一词的意义与通常不同。瞬时标记和interprogram-cut-function
的注释解释了某些副作用。
一旦设置了标记,缓冲区始终包含一个区域。如果愿意,可以使用瞬时标记模式临时突出显示区域。 (没有人希望一直突出显示区域,因此瞬时标记模式仅在适当的时候突出显示。许多人关闭瞬时标记模式,因此区域永远不会被突出显示。)
此外,窗口系统允许在不同程序之间复制、剪切和粘贴。例如,在X窗口系统中,interprogram-cut-function
函数是x-select-text
,它与窗口系统的Emacs kill环的等价物一起工作。
copy-region-as-kill
函数的主体以一个if
子句开始。该子句的作用是区分两种不同的情况:是否立即在先前的kill-region
命令之后执行此命令。在第一种情况下,新区域将附加到先前复制的文本。否则,它将作为一个独立的文本片段插入到kill环的开头。
函数的最后两行阻止区域在瞬时标记模式打开时突出显示。