GNU Emacs 32.0.50 (9008bf64c3) のマニュアルを PLaMo 翻訳で機械翻訳したものです。誤訳を含むことがあります。原文: https://www.gnu.org/software/emacs/manual/html_node/elisp/Event-Input-Misc.html ・ emacs-doc.conao3.com

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

この節では、イベントを消費せずに先読みする方法、保留中の入力を確認する方法、および保留中の入力を破棄する方法について説明します。また、関数 read-passwd についても参照してください(パスワードの読み取り を参照)。

変数: unread-command-events

この変数には、コマンド入力として読み込まれるのを待っているイベントのリストが格納されています。イベントはリストに現れた順に使用され、使用されるたびに一つずつ削除されます。

この変数が必要なのは、場合によっては関数がイベントを読み取った後、それを使用しないと判断することがあるためです。この変数にイベントを格納しておくことで、コマンドループや、コマンド入力を読み取る関数によって通常通り処理されるようになります。

例えば、数値プレフィックス引数を実装する関数は、任意の桁数を読み取ります。数字以外のイベントを検出した際は、コマンドループで通常通り読み取れるよう、そのイベントを読み戻さなければなりません。同様に、インクリメンタルサーチでもこの機能を利用して、検索において特別な意味を持たないイベントを読み戻します。こうしたイベントは、検索を終了して通常通り実行されるべきだからです。

キーシーケンスからイベントを抽出して unread-command-events に格納する、確実で簡単な方法は、listify-key-sequence を使用することです(以下参照)。

通常は、このリストの先頭にイベントを追加し、直近に未読となったイベントから順に再読するようにします。

このリストから読み込まれたイベントは、最初に読み込まれた時点で既に一度追加されているため、通常は現在のコマンドのキーシーケンス(例えば this-command-keys などで返されるもの)には追加されません。(t . event) 形式の要素を指定すると、event が現在のコマンドのキーシーケンスに強制的に追加されます。

このリストから読み取られた要素は、通常、記録機能(入力の記録を参照)や、キーボードマクロの定義時(キーボードマクロを参照)に記録されます。ただし、(no-record . event) 形式の要素は、event を記録せずに通常通り処理させます。

関数: listify-key-sequence key

この関数は、文字列またはベクトル key を個々のイベントのリストに変換し、それを unread-command-events に代入できるようにします。

関数: input-pending-p &optional check-timers

この関数は、現在読み取り可能なコマンド入力があるかどうかを判定します。入力がある場合は t、ない場合は nil を返して直ちに処理を終了します。まれに、入力がない場合に t を返すことがあります。

オプション引数 check-timers が nil 以外の場合、入力がない場合は、Emacs は準備が整っているタイマーを実行します。遅延実行用タイマー を参照してください。

変数: last-input-event

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

以下の例では、Lispプログラムは文字 1(ASCIIコード 49)を読み込みます。これが last-input-event の値となり、一方で C-e(この式の評価には C-x C-e コマンドが使用されていると想定します)は last-command-event の値のままとなります。

(progn (print (read-char))
       (print last-command-event)
       last-input-event)
     ⊣ 49
     ⊣ 5
     ⇒ 49
マクロ: while-no-input body…

このコンストラクトはbodyフォームを実行し、最後のフォームの値を返します—ただし、入力が一切届かない場合に限ります。bodyフォームの実行中に何らかの入力が届くと、それらの実行を中断します(quitとほぼ同様に動作します)。while-no-inputフォームは、実際のquitによって中断された場合はnilを、他の入力の到着によって中断された場合はtを返します。

bodyの一部がinhibit-quitをnon-nilにバインドしている場合、その部分の途中で入力が届いても、その部分が終わるまでアボートは発生しません。

body によって計算されるあらゆる値を、両方の種類のアボート条件から区別できるようにしたい場合は、次のようにコードを記述してください。

(while-no-input
  (list
    (progn . body)))
変数: while-no-input-ignore-events

この変数では、while-no-input が無視すべき特殊なイベントを指定できます。これはイベントシンボルのリストです(イベントの例を参照してください)。

関数: discard-input

この関数は、ターミナル入力バッファの内容を破棄し、定義途中のキーボードマクロがあればそれをキャンセルします。戻り値は nil です。

以下の例では、ユーザーはフォームの評価を開始した直後に、いくつかの文字を入力することがあります。sleep-for のスリープが終了した後、discard-input はスリープ中に入力された文字をすべて破棄します。

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