Previous: Quoted Character Input, Up: Reading Input


20.6.4 その他のイベント入力機能

本節では、イベントを処理せずに『まえもって覗き見』する方法、 処理待ちの入力の有無の検査方法、処理待ちの入力の破棄方法について述べます。 関数read-passwdも参照してください(see Reading a Password)。

— Variable: unread-command-events

この変数は、コマンド入力として読まれることを 待っているイベントのリストを保持する。 イベントはリストに現れる順に使われ、使われると1つ1つ取り除かれる。

関数でイベントを読んだあとにそれを使わない場面があるため、 この変数が必要になる。 この変数にイベントを保存すると、 コマンドループやコマンド入力を読む関数によって通常どおり処理される。

たとえば、数値前置引数を実現する関数は、任意個数の数字文字を読み取る。 数字文字でないイベントをみつけたら、そのイベントを読み戻して、 コマンドループが通常どおりに読めるようにする必要がある。 同様に、インクリメンタルサーチでは、この機能を使って 探索においては意味を持たないイベントを読み戻す。 なぜなら、そのようなイベントは探索を終了させ、 通常どおり実行される必要があるからである。

unread-command-eventsに入れられるように キー列からイベントを確実に簡単に取り出す方法は listify-key-sequenceを使うことである(see Strings of Events)。

もっとも最近に読み戻したイベントが最初に再度読まれるように、 普通はこのリストの先頭にイベントを追加する。

— Function: listify-key-sequence key

この関数は、文字列やベクトルであるkeyを個々のイベントのリストに変換する。 この結果はunread-command-eventsに入れられる。

— Variable: unread-command-char

この変数は、コマンド入力として読まれる文字を保持する。 値「-1」は、『空』を意味する。

この変数はほとんど廃れており、 かわりにunread-command-eventsを使うべきである。 Emacs 18版以前向けに書かれたプログラムを扱うためだけに存在する。

— Function: input-pending-p

この関数は、現在、コマンド入力があるかどうかを調べる。 ただちに返るが、入力があれば値tを、 さもなければnilを返す。 入力がないのにtを返すことが稀にある。

— Variable: last-input-event
— Variable: last-input-char

この変数は、コマンドの一部として、あるいは、Lispプログラムが明示的に 読み取った最後の端末入力イベントを記録する。

以下の例で、Lispプログラムは文字1ASCIIコード49)を読む。 それがlast-input-eventの値になるが、 (この式を評価するコマンドはC-x C-eと仮定するので) last-command-eventの値はC-eのままである。

          (progn (print (read-char))
                 (print last-command-event)
                 last-input-event)
               -| 49
               -| 5
               ⇒ 49

Emacs 18版との互換性のために、別名last-input-charが存在する。

— Function: discard-input

この関数は端末入力バッファの内容を廃棄し、 定義中のキーボードマクロを取り消す。 これはnilを返す。

以下の例で、フォームを評価しはじめてから、ユーザーは何文字か打つ。 sleep-forが待機を終えると、 discard-inputは待機中に打たれた文字をすべて破棄する。

          (progn (sleep-for 2)
                 (discard-input))
               ⇒ nil