append-to-buffer 概述 ¶append-to-buffer 命令使用 insert-buffer-substring 函数复制区域内容。insert-buffer-substring 的功能可从名称看出:从一个缓冲区取出子串并插入到另一个缓冲区。
append-to-buffer 的大部分逻辑都在为 insert-buffer-substring 创造运行条件:代码需要指定文本要写入的目标缓冲区、文本来源与目标窗口,以及要复制的区域范围。
以下是该函数的一种实现方式:
(defun append-to-buffer (buffer start end) "将区域中的文本追加到指定缓冲区。 文本会插入到该缓冲区的光标之前。
从程序中调用时需传入三个参数:
BUFFER(或缓冲区名)、START 与 END。
START 与 END 指定当前缓冲区中要复制的部分。"
(interactive
(list (read-buffer "Append to buffer: " (other-buffer
(current-buffer) t))
(region-beginning) (region-end)))
(let ((oldbuf (current-buffer)))
(save-excursion
(let* ((append-to (get-buffer-create buffer))
(windows (get-buffer-window-list append-to t t))
point)
(set-buffer append-to)
(setq point (point))
(barf-if-buffer-read-only)
(insert-buffer-substring oldbuf start end)
(dolist (window windows)
(when (= (window-point window) point)
(set-window-point window (point))))))))
可以将该函数拆分为一系列填充好的模板来理解。
最外层是函数定义模板。在该函数中,模板(已填充部分内容)如下:
(defun append-to-buffer (buffer start end) "documentation..." (interactive ...) body...)
函数第一行包含函数名与三个参数:要复制文本的目标 buffer,以及当前缓冲区中待复制区域的起始 start 与结束 end 位置。
接下来是清晰完整的文档字符串。按照惯例,三个参数使用大写字母以便识别。更完善的是,参数说明顺序与参数列表顺序一致。
注意文档中区分了缓冲区与其名称。(该函数两种形式均可处理。)