zap-to-charの完全な実装 ¶zap-to-char
関数は、カーソル(すなわちポイント)の位置から、指定された文字の次の出現箇所まで(その出現箇所を含む)の範囲にあるテキストを削除します。zap-to-char が削除したテキストはキルリングに格納され、C-y (yank)
と入力することでキルリングから復元できます。コマンドに引数が指定された場合は、その出現回数分までのテキストが削除されます。したがって、カーソルがこの文の先頭にあり、文字が
‘s’ である場合、‘Thus’ が削除されます。引数が 2 であれば、‘cursor’ 内の ‘s’ まで(その出現箇所を含む)の ‘Thus,
if the curs’ が削除されます。
指定した文字が見つからない場合、zap-to-charは「Search
failed」と表示し、入力した文字を知らせるだけで、テキストは一切削除しません。
削除するテキスト量を決定するため、zap-to-charは検索機能を利用します。テキストを操作するコードでは検索機能が多用されており、本稿では削除コマンドと併せて、検索機能についても詳しく見ていきます。
関数のバージョン22の実装の全文は以下の通りです:
(defun zap-to-char (arg char)
"Kill up to and including ARG'th occurrence of CHAR.
Case is ignored if `case-fold-search' is non-nil in the current buffer.
Goes backward if ARG is negative; error if CHAR not found."
(interactive "p\ncZap to char: ")
(if (char-table-p translation-table-for-input)
(setq char (or (aref translation-table-for-input char) char)))
(kill-region (point) (progn
(search-forward (char-to-string char)
nil nil arg)
(point))))
ドキュメントは充実しています。ただ、「kill」という単語の専門用語としての意味は知っておく必要があります。
zap-to-char のバージョン 22 のドキュメント文字列では、シンボルをクォートするために
ASCII のグレイヴアクセントとアポストロフィが使用されているため、`case-fold-search'
と表示されます。このクォート形式は、グレイヴアクセントとアポストロフィがしばしば引用符として適した鏡像になっていた 1970
年代のディスプレイから着想を得たものです。現代のほとんどのディスプレイではもはやそうではなく、ドキュメント文字列や診断メッセージ形式にこれら 2 つの
ASCII 文字が現れると、Emacs は通常、それらを カーブドクォート(左右のシングルクォート)に変換するため、前述のシンボルは ‘case-fold-search’
と表示されます。ソースコード文字列では、単にカーブドクォートを直接使用することも可能です。