次: , 前: Reading Input, 上: Reading Input


20.6.1 キー列の入力

コマンドループは、read-key-sequenceを呼ぶことで キー列の入力を読み取ります。 Lispプログラムからこの関数を呼び出してもよく、 たとえば、describe-keyは、 説明対象とするキーを読むためにこの関数を使います。

— 機能: read-key-sequence prompt

この関数は、キー列を読み取り文字列かベクトルとして返す。 完全なキー列を収集し終えるまで、 つまり、現在活性なキーマップにおいて、非プレフィックスコマンドを 指定するのに十分になるまで、イベントを読み続ける。

イベントがすべて文字であり、かつ、それらが文字列に収まるならば、 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-vector prompt

これはread-key-sequenceと同様であるが、 つねにベクトルとしてキー列を返し、文字列としてはけっして返さない。 see Strings of Events

入力文字が大文字であって、それらにキーバインディングがないとき、 対応する小文字にキーバインディングがあれば、 read-key-sequenceは文字を小文字に変換します。 lookup-keyはこのような変換を行わないことに注意してください。

関数read-key-sequenceは、ある種のマウスイベントも変換します。 バインディングのないドラッグイベントをクリックイベントに変換したり、 バインディングのないボタン押し下げイベントを完全に無視します。 さらに、フォーカスイベントとその他のウィンドウイベントを並び替えて、 それらが他のイベントのキー列の途中に現れないようにします。

マウスイベントが、モード行やスクロールバーなどのウィンドウの特別な部分で 生起しても、特別なイベント型はなく、マウスボタンや修飾キーの 組み合わせを普通どおりに表したシンボルです。 ウィンドウのどの部分かに関する情報は、 イベント内の別の部分、つまり、座標に入っています。 しかし、read-key-sequenceは、その情報を シンボルmode-linevertical-linehorizontal-scroll-barvertical-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))]
— 変数: num-input-keys

この変数の値は、現在のEmacsセッションにおいて、 これまでに処理されたキー列の個数である。 これには、端末から読み取ったキー列、および、 実行したキーボードマクロから読み取ったキー列が含まれる。

— 変数: num-nonmacro-input-events

この変数は、端末からこれまでに受け取った入力イベントの総個数を保持する。 キーボードマクロで生成されたものは含まない。