Previous: , Up: Reading Input   [Contents][Index]


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

このセクションではイベントを使い切らずに先読みする方法と、入力の保留や保留の破棄の方法について説明します。Reading a Passwordの関数read-passwdも参照してください。

Variable: unread-command-events

この変数はコマンド入力として読み取り待機中のイベントのリストを保持する。イベントはこのリスト内の出現順に使用され、使用されるごとにリストから取り除かれる。

ある関数がイベントを読み取ってそれを使用するかどうか決定する場合がいくつかあるためにこの変数が必要になる。この変数にイベントを格納するとコマンドループやコマンド入力を読み取る関数によってイベントは通常のように処理される。

たとえば数引数を実装する関数は、任意の個数の数字を読み取る。数字イベントが見つからないとき、関数はそのイベントを読み戻す(unread)ので、そのイベントはコマンドループによって通常通り読み取られることができる。同様にインクリメンタル検索は、検索において特別な意味をもたないイベントを読み戻すためにこの機能を使用する。なぜならそれらのイベントは検索をexitして、通常どおり実行されるべきだからである。

unread-command-eventsにイベントを置くためにキーシーケンスからイベントを抽出するには、listify-key-sequence (以下参照)を使用するのが簡単で信頼のおける方法である。

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

このリストから読み取ったイベントは、通常はそのイベントが最初に読み取られたときにすでに一度追加されたときのように、カレントコマンドのキーシーケンスに(たとえばthis-command-keysにリターンされたときのように)追加される。フォーム(t . event)の要素はカレントコマンドのキーシーケンスにeventを強制的に追加する。

このリストから読み取った要素は通常は記録保持機能(Recording Inputを参照)により記録されるとともに、キーボードマクロ定義の間(Keyboard Macrosを参照)は記録される。しかし(no-record . event)という形式の要素は、通常は記録されることなくeventが処理される。

Function: listify-key-sequence key

この関数は文字列かベクターのkeyunread-command-eventsにputすることができる個別のイベントのリストに変換する。

Function: input-pending-p &optional check-timers

この関数はコマンド入力がカレントで読み取り可能かどうか判断する。入力が利用可能ならt、それ以外はnilを即座にリターンする。非常に稀だが入力が利用できないときはtをリターンする。

オプション引数check-timersが非nilなら、Emacsは準備ができるとすべてのタイマーを実行する。Timersを参照のこと。

Variable: last-input-event

この変数は最後に読み取られた端末入力イベントがコマンドの一部なのか、それとも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
Macro: while-no-input body…

この構文は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)))
Variable: while-no-input-ignore-events

この変数はwhile-no-inputが無視するべきスペシャルイベントのセッティングを可能にする。これはイベントシンボルのリスト(Event Examplesを参照)。

Function: discard-input

この関数は端末入力バッファーの内容を破棄して定義処理中かもしれないキーボードマクロをキャンセルする。この関数はnilをリターンする。

以下の例ではフォームの評価開始直後にユーザーが数字か文字をタイプするかもしれない。sleep-forがスリープを終えた後にdiscard-inputはスリープ中にタイプされた文字を破棄する。

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