33.8.3 取回文本

取回(yanking) 指从删除环插入文本,但并非直接插入。 yank 等相关命令会通过 insert-for-yank 在插入前对文本做特殊处理。

Function: insert-for-yank string

此函数行为类似 insert,但会先依据 yank-handler 文本属性、 以及变量 yank-handled-propertiesyank-excluded-properties(见下文)处理字符串, 再将结果插入当前缓冲区。

string 在插入前会经过 yank-transform-functions 处理。

Function: insert-buffer-substring-as-yank buf &optional start end

此函数类似 insert-buffer-substring,但会依据 yank-handled-propertiesyank-excluded-properties 处理文本。 (它不处理 yank-handler 属性,该属性通常不会出现在缓冲区文本中。)

若为字符串全部或部分设置 yank-handler 文本属性,会改变 insert-for-yank 的插入方式。 若字符串不同部分拥有不同 yank-handler 值(使用 eq 比较),则各子串会被分别处理。 属性值必须是包含 1–4 个元素的列表,格式如下(首个元素之后可省略):

(function param noexclude undo)

各元素作用如下:

function

functionnil,则调用它而非 insert 插入字符串,参数为待插入字符串。

param

param 存在且非 nil,它会替代 string(或当前处理子串) 传递给 function(或 insert)。 例如,若 functionyank-rectangleparam 应为矩形文本字符串列表。

noexclude

noexclude 存在且非 nil,则禁用 yank-handled-propertiesyank-excluded-properties 对插入字符串的常规处理。

undo

undo 存在且非 nil,它是一个函数,会被 yank-pop 调用以撤销当前对象的插入。 调用时传入两个参数:当前区域的起点与终点。 function 可设置 yank-undo-function 覆盖此值。

User Option: yank-handled-properties

此变量指定取回文本时对特殊文本属性的处理规则。 处理时机在文本插入后(普通插入或通过 yank-handler)、yank-excluded-properties 生效前。

值应为形如 (prop . fun) 的关联表。 各项按顺序处理。程序扫描插入文本中具有 eqprop 的属性片段, 对每一片段调用 fun,传入三个参数:属性值、文本起点与终点。

User Option: yank-excluded-properties

此变量的值为需要从插入文本中移除的属性列表。 默认包含可能导致不良效果的属性,如鼠标响应、按键绑定等。 其执行顺序在 yank-handled-properties 之后。

Variable: yank-transform-functions

此变量为函数列表。每个函数依次以待取回字符串为参数调用,并返回(可能经过转换的)字符串。 该变量可全局设置,也可用于实现 yank 的变体命令。 例如,实现一个清理空白后再插入的取回命令:

(defun yank-with-clean-whitespace ()
  (interactive)
  (let ((yank-transform-functions
	 '(string-clean-whitespace)))
    (call-interactively #'yank)))