次: Reading One Event, 前: Reading Input, 上: Reading Input
コマンドループは、read-key-sequenceを呼ぶことで
キー列の入力を読み取ります。
Lispプログラムからこの関数を呼び出してもよく、
たとえば、describe-keyは、
説明対象とするキーを読むためにこの関数を使います。
この関数は、キー列を読み取り文字列かベクトルとして返す。 完全なキー列を収集し終えるまで、 つまり、現在活性なキーマップにおいて、非プレフィックスコマンドを 指定するのに十分になるまで、イベントを読み続ける。
イベントがすべて文字であり、かつ、それらが文字列に収まるならば、
read-key-sequenceは文字列(see Strings of Events)を返す。 さもなければ、ベクトルを返す。 ベクトルならば、任意の種類のイベント、つまり、 文字、シンボル、リストを保持できるからである。 文字列やベクトルの要素は、キー列のイベントである。引数promptは、プロンプトとしてエコー領域に表示する文字列であるか、 あるいは、プロンプトを表示しないことを意味する
nilである。以下の例では、プロンプト`?'がエコー領域に表示され、 ユーザーはC-x C-fと打つ。
(read-key-sequence "?") ---------- Echo Area ---------- ?C-x C-f ---------- Echo Area ---------- => "^X^F"関数
read-key-sequenceは中断を抑止する。 この関数が動作中にC-gを打っても、他の文字と同様に扱い、quit-flagを設定しない。 see Quitting。
これは
read-key-sequenceと同様であるが、 つねにベクトルとしてキー列を返し、文字列としてはけっして返さない。 see Strings of Events。
入力文字が大文字であって、それらにキーバインディングがないとき、
対応する小文字にキーバインディングがあれば、
read-key-sequenceは文字を小文字に変換します。
lookup-keyはこのような変換を行わないことに注意してください。
関数read-key-sequenceは、ある種のマウスイベントも変換します。
バインディングのないドラッグイベントをクリックイベントに変換したり、
バインディングのないボタン押し下げイベントを完全に無視します。
さらに、フォーカスイベントとその他のウィンドウイベントを並び替えて、
それらが他のイベントのキー列の途中に現れないようにします。
マウスイベントが、モード行やスクロールバーなどのウィンドウの特別な部分で
生起しても、特別なイベント型はなく、マウスボタンや修飾キーの
組み合わせを普通どおりに表したシンボルです。
ウィンドウのどの部分かに関する情報は、
イベント内の別の部分、つまり、座標に入っています。
しかし、read-key-sequenceは、その情報を
シンボルmode-line、vertical-line、horizontal-scroll-bar、
vertical-scroll-barを用いた仮想的な『プレフィックスキー』に変換します。
ウィンドウの特別な部分におけるマウスクリックの意味は、
これらの仮想的なプレフィックスキーを用いてキー列を定義することで
定義できます。
たとえば、read-key-sequenceを呼び出してから、
ウィンドウのモード行でクリックすると、
つぎのような2つのイベントを得ます。
(read-key-sequence "Click on the mode line: ")
=> [mode-line
(mouse-1
(#<window 6 on NEWS> mode-line
(40 . 63) 5959987))]