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

22.8.2 単一イベントの読み取り

コマンド入力用の最下位レベル関数は、read-event、read-char、およびread-char-exclusiveです。

ミニバッファを使用して文字を読み取る関数が必要な場合は、read-char-from-minibuffer を使用してください(多肢選択式の質問をするを参照)。

関数: read-event &optional prompt inherit-input-method seconds

この関数は、コマンド入力の次のイベントを読み取って返し、必要に応じてイベントが発生するまで待機します。

返されるイベントは、ユーザーから直接、あるいはキーボードマクロから送信される場合があります。このイベントは、キーボードの入力符号化方式(ターミナル入出力符号化を参照)によってデコードされることはありません。

オプション引数 prompt が nil 以外の場合、それはエコー領域にプロンプトとして表示される文字列である必要があります。prompt が nil または文字列 ‘""’ である場合、read-event は入力待ちであることを示すメッセージを表示せず、代わりに以下をエコーすることでプロンプトを表示します。すなわち、現在のコマンドに至った、あるいはそのコマンドによって読み取られたイベントの説明を表示します。エコー領域 を参照してください。

inherit-input-method が nil でない場合、非ASCII文字を入力できるように、現在の入力メソッド(もしあれば)が使用されます。そうでない場合、このイベントの読み取りにおける入力メソッド処理は無効になります。

cursor-in-echo-area が nil でない場合、read-event はカーソルを一時的にエコー領域の、そこに表示されているメッセージの末尾まで移動させます。そうでない場合、read-event はカーソルを移動させません。

seconds が nil でない場合、それは入力を待機する最大時間(秒単位)を指定する数値である必要があります。その時間内に入力が得られない場合、read-event は待機を停止し、nil を返します。浮動小数点数の seconds は、小数点以下の秒数を待機することを意味します。一部のシステムでは整数秒のみをサポートしており、これらのシステムでは seconds は切り捨てられます。seconds が nil である場合、read-event は入力が届くまで必要な限り待機します。

seconds が nil の場合、Emacs はユーザー入力の到着を待つ間、アイドル状態にあるとみなされます。アイドルタイマー—run-with-idle-timer で作成されるもの(アイドルタイマー を参照)—は、この期間中に動作することがあります。ただし、seconds が nil 以外の場合、アイドル状態は変わりません。read-event が呼び出された際に Emacs が非アイドル状態であれば、read-event の動作中も非アイドル状態のままとなります。また、Emacs がアイドル状態であれば(呼び出しがアイドルタイマー内で行われた場合に起こり得ます)、そのままアイドル状態が維持されます。

read-event がヘルプ文字として定義されたイベントを受信した場合、状況によっては read-event がイベントを返さずに直接処理することがあります。ヘルプ関数 を参照してください。特殊イベントと呼ばれるその他の特定のイベントも、read-event 内で直接処理されます(特殊イベント を参照)。

read-event を呼び出してから右矢印のファンクションキーを押すと、次のようになります:

(read-event)
     ⇒ right
関数: read-char &optional prompt inherit-input-method seconds

この関数は、文字入力イベントを読み取って返します。ユーザーが文字以外のイベント(すなわちマウスクリックやファンクションキーイベント)を発生させた場合、read-char はエラーを示します。引数の扱いは read-event と同様です。

イベントに修飾子が含まれている場合、Emacsはそれらを解決し、対応する文字のコードを返そうとします。例えば、ユーザーが C-a と入力した場合、関数は 1 を返します。これは ‘C-a’ という文字の ASCII コードです。一部の修飾子を文字コードに反映できない場合、read-char は未解決の修飾子ビットを返されるイベントに保持したままにします。例えば、ユーザーが C-M-a と入力した場合、関数は 134217729(16進数で 8000001)、すなわち Meta 修飾子ビットがセットされた ‘C-a’ を返します。この値は有効な文字コードではなく、characterp テストに失敗します(文字コード を参照)。修飾子ビットを除去した文字コードを復元するには event-basic-type (イベントの分類 を参照)を、read-char によって返される文字イベント内の修飾子をテストするには event-modifiers を使用してください。

以下の最初の例では、ユーザーが文字 1(ASCIIコード 49)を入力します。2番目の例では、eval-expression を使用してミニバッファから read-char を呼び出すキーボードマクロの定義を示しています。read-char はキーボードマクロの直後の文字である 1 を読み込みます。その後、eval-expression はその戻り値をエコーエリアに表示します。

(read-char)
     ⇒ 49

;; We assume here you use M-: to evaluate this.
(symbol-function 'foo)
     ⇒ "^[:(read-char)^M1"
(execute-kbd-macro 'foo)
     ⊣ 49
     ⇒ nil
関数: read-char-exclusive &optional prompt inherit-input-method seconds

この関数は、文字入力イベントを読み取って返します。ユーザーが文字イベントではないイベントを発生させた場合、read-char-exclusive はそれを無視し、文字が取得できるまで別のイベントを読み取り続けます。引数の扱いは read-event と同様です。返される値には、read-char と同様に修飾ビットが含まれる場合があります。

上記の関数はいずれも終了を抑制しません。

変数: num-nonmacro-input-events

この変数には、キーボードマクロによって生成されたものを除き、これまでに端末から受信した入力イベントの総数が格納されています。

read-key-sequenceとは異なり、関数read-event、read-char、read-char-exclusiveはイベントシーケンスの翻訳用キーマップで説明されている翻訳を行わない点にご留意ください。これらの翻訳を考慮して単一のキーを読み取りたい場合(例えば、ターミナルでファンクションキーを読み取る場合や、xterm-mouse-modeからマウスイベントを読み取る場合など)は、関数read-keyを使用してください:

関数: read-key &optional prompt disable-fallbacks

この関数は単一のキーを読み取ります。read-key-sequence と read-event の中間的な位置づけです。前者とは異なり、キーシーケンスではなく単一のキーを読み取ります。後者とは異なり、生のイベントを返すのではなく、input-decode-map、local-function-key-map、key-translation-map に従ってユーザー入力をデコードおよび変換します(イベントシーケンスを変換するためのキーマップを参照してください)。

引数 prompt は、エコー領域にプロンプトとして表示する文字列か、プロンプトを表示しないことを意味する nil のいずれかです。

引数 disable-fallbacks が nil 以外の場合、read-key-sequence における未バインドキーに対する通常のフォールバックロジックは適用されません。つまり、マウスボタンダウンおよびマルチクリックイベントは破棄されず、local-function-key-map および key-translation-map も適用されません。nil が指定されているか、あるいは未指定の場合、無効化される唯一のフォールバックは直前のイベントのダウンケース処理となります。

関数: read-char-choice prompt chars &optional inhibit-quit

この関数は read-from-minibuffer を使用して、単一文字のリストであるはずの chars に含まれる単一文字を読み取り、返します。chars に含まれない入力文字は破棄し、その旨のメッセージを表示します。

オプション引数 inhibit-quit はデフォルトでは無視されますが、変数 read-char-choice-use-read-key が nil 以外の場合、この関数は read-from-minibuffer の代わりに read-key を使用し、その場合 inhibit-quit が nil 以外であることは、有効な入力を待つ間、キーボード終了イベントを無視することを意味します。さらに、read-char-choice-use-read-key が nil 以外の場合、この関数の呼び出し時に help-form(ヘルプ関数 を参照)を nil 以外の値にバインドすると、ユーザーが help-char を押したときに help-form を評価してその結果を表示し、その後、引き続き有効な入力文字またはキーボード終了を待機します。

関数: read-multiple-choice prompt choices &optional help-string show-help long-form

ユーザーに選択肢形式の質問を行い、選択した回答を返してください。promptはプロンプトとして表示する文字列とします。

choices はアリストであり、各エントリの第1要素はユーザーが入力可能な文字、第2要素はプロンプト表示時に表示されるエントリの短縮名(スペースがある場合はさらに短縮されることがあります)、そして任意の第3要素は、ユーザーがさらなるヘルプを求めた際にヘルプバッファに表示されるより詳細な説明となっています。

戻り値は、ユーザーが入力した文字に一致する choices のエントリです。

オプション引数 help-string が nil 以外の場合、すべての選択肢についてより詳細な説明を記述した文字列を指定する必要があります。ユーザーが ? と入力すると、デフォルトで自動生成される説明の代わりに、この文字列がヘルプバッファに表示されます。

オプション引数 show-help が nil 以外の場合、ユーザー入力が行われる前にヘルプバッファが即座に表示されます。文字列の場合は、それをヘルプバッファの名前として使用します。

オプション引数 long-form が nil 以外の場合、ユーザーは単一のキーを押す代わりに、長文形式の回答(completing-read を使用)を入力する必要があります。回答は、choices リスト内の値の2番目の要素に含まれている必要があります。

デフォルトでは、この関数はユーザー入力の読み取りに read-from-minibuffer を使用します(ミニバッファによるテキスト文字列の読み取り を参照)。ただし、変数 read-char-choice-use-read-key が nil 以外の場合は、代わりに read-key を使用します。

(read-multiple-choice
 "Continue connecting?"
 '((?a "always" "Accept certificate for this and future sessions.")
   (?s "session only" "Accept certificate this session only.")
   (?n "no" "Refuse to use certificate, close connection.")))

read-multiple-choice-face フェイスは、グラフィカル端末において名前文字列内の一致する文字を強調表示するために使用されます。