copy-region-as-kill 関数定義の全文
¶バージョン22のcopy-region-as-kill関数の全文は以下の通りです:
(defun copy-region-as-kill (beg end) "Save the region as if killed, but don't kill it. In Transient Mark mode, deactivate the mark. If `interprogram-cut-function' is non-nil, also save the text for a window system cut and paste." (interactive "r")
(if (eq last-command 'kill-region)
(kill-append (filter-buffer-substring beg end) (< end beg))
(kill-new (filter-buffer-substring beg end)))
(if transient-mark-mode
(setq deactivate-mark t))
nil)
いつものように、この関数は構成要素に分解できます:
(defun copy-region-as-kill (argument-list) "documentation..." (interactive "r") body...)
引数は beg と end であり、関数は
"r"
と対話的に動作するため、これら2つの引数は領域の始点と終点を指している必要があります。このドキュメントを最初から読み進めてきた方にとって、関数のこうした部分を理解することは、もはやほぼ当たり前のことでしょう。
「kill」という単語が通常とは異なる意味を持つことを念頭に置いておかないと、ドキュメントはやや分かりにくいです。Transient
Markとinterprogram-cut-functionのコメントで、特定の副作用について説明されています。
一度マークを付けると、バッファには常にリージョンが含まれます。必要に応じて、「一時マーク」モードを使用して、一時的にそのリージョンをハイライトできます。(常にリージョンをハイライトしておきたい人はいないため、「一時マーク」モードでは適切なタイミングでのみハイライトされます。多くの人が「一時マーク」モードをオフにしているため、リージョンがハイライトされることはありません。)
また、ウィンドウシステムを利用すれば、異なるプログラム間でコピー、切り取り、貼り付けを行うことができます。例えばXウィンドウシステムでは、interprogram-cut-function関数はx-select-textとなっており、これはウィンドウシステムにおけるEmacsのキルリングに相当する機能として動作します。
copy-region-as-kill 関数の本体は if 節から始まります。この節は、直前の kill-region
コマンドの直後にこのコマンドが実行されるか否かという、2つの異なる状況を判別します。前者の場合、新しいリージョンは以前にコピーされたテキストの末尾に追加されます。そうでない場合は、直前のテキストとは別のテキストとして、キルリングの先頭に挿入されます。
関数の最後の2行により、Transient Markモードが有効な場合、リージョンが点灯しないようになっています。
copy-region-as-killの本体については、詳細に論じる価値がある。