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) "Append to specified buffer the text of the region. It is inserted into that buffer before its point.
When calling from a program, give three arguments:
BUFFER (or buffer name), START and END.
START and END specify the portion of the current buffer to be copied."
(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...)
関数の1行目には、その関数名と3つの引数が記述されています。引数は、テキストがコピーされる先のbufferと、コピー対象となる現在のバッファ内の領域のstartおよびendです。
関数の次の部分はドキュメントで、分かりやすく網羅的です。慣例通り、3つの引数は大文字で表記されているため、すぐに目に留まります。さらに良いことに、引数リストと同じ順序で説明されています。
なお、ドキュメントではバッファとその名称を区別している点にご注意ください。(関数はどちらにも対応しています。)