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...)
参数为 beg 和 end,且函数通过
"r" 声明为交互式,因此这两个参数必定代表选区的
起始与结束位置。如果你从头阅读本文档,
对函数的这些结构应该已经十分熟悉。
文档字符串乍看有些令人困惑,
除非你记得“kill”在这里的含义与日常不同。
关于临时标记模式与 interprogram-cut-function
的说明解释了相关的副作用。
一旦设置过标记,缓冲区就始终存在一个选区。 你可以开启临时标记模式,让选区临时高亮显示。 (没人希望选区一直高亮,因此临时标记模式只在合适时机高亮。 很多人会关闭临时标记模式,让选区永远不高亮。)
此外,窗口系统允许在不同程序间复制、剪切和粘贴。
例如在 X 窗口系统中,interprogram-cut-function
对应 x-select-text,
它与窗口系统中相当于 Emacs 删除环的机制协同工作。
copy-region-as-kill 的函数体以一个
if 语句开头。该语句用于区分两种情况:
本命令是否紧跟在 kill-region 之后执行。
若是,则新选区追加到之前复制的文本后;
否则,作为独立文本插入删除环开头。
函数最后两行用于在开启临时标记模式时 避免选区持续高亮。
copy-region-as-kill 的函数体值得详细讲解。