可使用下列函数将一个缓冲区的文本替换为另一缓冲区的文本:
该函数将当前缓冲区的可访问部分替换为缓冲区 source 的可访问部分。source
可以是缓冲区对象或缓冲区名称。当 replace-buffer-contents 执行成功时,
当前缓冲区可访问部分的文本将与 source 缓冲区可访问部分的文本一致。
该函数会尽量保持当前缓冲区中的点、标记、文本属性和覆盖层不变。该行为的一个典型适用场景
是外部代码格式化工具:这类程序通常会将格式化后的文本写入临时缓冲区或文件,而直接使用
delete-region 与 insert-buffer-substring 会破坏上述属性。不过,
后一种组合通常速度更快(See 删除文本,以及 插入文本)。
replace-buffer-contents 运行时需要对比原缓冲区与 source 的内容,
若缓冲区体积巨大且差异较多,该操作开销较高。为控制 replace-buffer-contents
的运行时间,它提供两个可选参数。
max-secs 以秒为单位设定硬性时间上限。若设定该值且执行超时,函数将降级使用
delete-region 与 insert-buffer-substring。
max-costs 设定差异计算的质量阈值。若实际开销超出该限制,函数将采用启发式算法 以获得更快但非最优的结果。默认值为 1000000。
若执行了非破坏性替换,replace-buffer-contents 返回 t;
否则(即超出 max-secs 限制时)返回 nil。
该函数使用指定的 replace-fn 替换 beg 与 end 之间的区域。 函数 replace-fn 在当前缓冲区中运行,且缓冲区已缩小至指定区域; 该函数应返回字符串或缓冲区,用于替换目标区域。
替换操作通过 replace-buffer-contents 完成(见上文),
max-secs、max-costs 参数与返回值的含义也与其一致。
注意:若替换内容为字符串,该字符串会被放入临时缓冲区,以便 replace-buffer-contents
处理。因此,若替换内容已存在于缓冲区中,无需使用 buffer-substring 等函数
将其转为字符串。