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 位置。

接下来是清晰完整的文档字符串。按照惯例,三个参数使用大写字母以便识别。更完善的是,参数说明顺序与参数列表顺序一致。

注意文档中区分了缓冲区与其名称。(该函数两种形式均可处理。)