Previous: Quoted Character Input, Up: Reading Input [Contents][Index]
このセクションでは、イベントを使い切ることなく“先読み”する方法、および入力の保留や保留の破棄の方法について説明します。Reading a Passwordの関数read-passwdも参照してください。
この変数はコマンド入力として読み取り待機中のイベントのリストを保持する。イベントはこのリスト内の出現順に使用され、使用されるごとにリストから取り除かれる。
ある関数がイベントを読み取ってそれを使用するかどうか決定する場合がいくつかあるので、この変数が必要になる。この変数にイベントを格納すると、コマンドループおよにコマンド入力を読み取る関数により、イベントは通常のように処理される。
たとえば、数引数を実装する関数は、任意の個数の数字を読み取る。数字イベントが見つからないとき、関数はそのイベントを読み戻す(unread)ので、そのイベントはコマンドループにより通常通り読み取られることができる。同様に、インクリメンタル検索は、検索において特別な意味をもたないイベントを読み戻すために、この機能を使用する。なぜなら、それらのイベントは検索をexitして、通常どおり実行されるべきだからである。
unread-command-eventsにイベントを置くためにキーシーケンスからイベントを抽出するには、listify-key-sequence(以下参照)を使用するのが簡単で信頼のおける方法である。
もっとも最近読み戻したイベントが最初に再読み取りされるように、このリストの先頭にイベントを追加するのが通常である。
通常このリストから読み取ったイベントは、そのイベントが最初に読み取られたときにすでに一度追加されたときのように、カレントコマンドのキーシーケンスに(たとえばthis-command-keysにリターンされたとみのように)追加される。フォーム(t . event)の要素は、カレントコマンドのキーシーケンスにeventを強制的に追加する。
この関数は文字列またはベクターのkeyを、unread-command-events置くことができる個別のイベントのリストに変換する。
この関数は、コマンド入力がカレントで読み取り可能かどうか判断する。入力が利用可能なら即座にtを、それ以外はnilをリターンする。非常に稀だが、入力が利用できないときにt
オプション引数check-timersが非nilの場合、Emacsは順部位ができたら任意のタイマーを実行する。Timersを参照のこと。
この変数は最後に読み取られた端末入力イベントがコマンドの一部なのか、それともLispプログラムによる明示的なものなのかを記録する。
以下の例では、文字1(ASCIIコード49)をLispプログラムが読み取っている。C-e(C-x
C-eは式を評価するコマンドとする)がlast-command-eventに値として残っている間は、それがlast-input-eventの値となる。
(progn (print (read-char))
(print last-command-event)
last-input-event)
-| 49
-| 5
⇒ 49
この構成はbodyフォームを実行して、入力が何も到着しない場合だけ最後のフォームの値をリターンする。bodyフォームを実行する間に何らかの入力が到着した場合は、それらの入力をする(quitのように機能する)。while-no-inputフォームは実際のquitによりabortした場合はnil、入力の到着によりabortした場合はtをリターンする。
bodyの一部でinhibit-quitを非nilにバインドした場合、その部分の間に到着した入力は、その部分が終わるまでabortしない。
両方のabort条件をbodyにより計算されたすべての可能な値で区別できるようにしたい場合は、以下のようにコードを記述する:
(while-no-input
(list
(progn . body)))
この関数は端末入力バッファーの内容を破棄して定義処理中かもしれないキーボードマクロをキャンセルする。この関数はnilをリターンする。
以下の例では、フォームの評価開始直後にユーザーが数字か文字をタイプするかもしれない。sleep-forがスリープを終えた後、discard-inputはスリープ中にタイプされた文字を破棄する。
(progn (sleep-for 2)
(discard-input))
⇒ nil