33.23 替换缓冲区文本

可使用下列函数将一个缓冲区的文本替换为另一缓冲区的文本:

Command: replace-buffer-contents source &optional max-secs max-costs

该函数将当前缓冲区的可访问部分替换为缓冲区 source 的可访问部分。source 可以是缓冲区对象或缓冲区名称。当 replace-buffer-contents 执行成功时, 当前缓冲区可访问部分的文本将与 source 缓冲区可访问部分的文本一致。

该函数会尽量保持当前缓冲区中的点、标记、文本属性和覆盖层不变。该行为的一个典型适用场景 是外部代码格式化工具:这类程序通常会将格式化后的文本写入临时缓冲区或文件,而直接使用 delete-regioninsert-buffer-substring 会破坏上述属性。不过, 后一种组合通常速度更快(See 删除文本,以及 插入文本)。

replace-buffer-contents 运行时需要对比原缓冲区与 source 的内容, 若缓冲区体积巨大且差异较多,该操作开销较高。为控制 replace-buffer-contents 的运行时间,它提供两个可选参数。

max-secs 以秒为单位设定硬性时间上限。若设定该值且执行超时,函数将降级使用 delete-regioninsert-buffer-substring

max-costs 设定差异计算的质量阈值。若实际开销超出该限制,函数将采用启发式算法 以获得更快但非最优的结果。默认值为 1000000。

若执行了非破坏性替换,replace-buffer-contents 返回 t; 否则(即超出 max-secs 限制时)返回 nil

Function: replace-region-contents beg end replace-fn &optional max-secs max-costs

该函数使用指定的 replace-fn 替换 begend 之间的区域。 函数 replace-fn 在当前缓冲区中运行,且缓冲区已缩小至指定区域; 该函数应返回字符串或缓冲区,用于替换目标区域。

替换操作通过 replace-buffer-contents 完成(见上文), max-secsmax-costs 参数与返回值的含义也与其一致。

注意:若替换内容为字符串,该字符串会被放入临时缓冲区,以便 replace-buffer-contents 处理。因此,若替换内容已存在于缓冲区中,无需使用 buffer-substring 等函数 将其转为字符串。