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

以下是 Emacs 22 版本中 copy-region-as-kill 的完整代码:

(defun copy-region-as-kill (beg end)
  "将选区按删除操作的方式保存,但并不真正删除文本。
在临时标记模式下,取消标记激活状态。
若 `interprogram-cut-function' 非 nil,同时为窗口系统的剪切粘贴
保存该文本。"
  (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 删除环的机制协同工作。

copy-region-as-kill 的函数体以一个 if 语句开头。该语句用于区分两种情况: 本命令是否紧跟在 kill-region 之后执行。 若是,则新选区追加到之前复制的文本后; 否则,作为独立文本插入删除环开头。

函数最后两行用于在开启临时标记模式时 避免选区持续高亮。

copy-region-as-kill 的函数体值得详细讲解。