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
にputすることができる個別のイベントのリストに変換する。
この関数はコマンド入力がカレントで読み取り可能かどうか判断する。入力が利用可能なら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フォームを実行する間に何らかの入力が到着したら、それらの入力をabortする(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