Next: , Previous: , Up: 入力の読み取り   [Contents][Index]


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

read-eventread-charread-char-exclusiveはコマンド入力にたいするもっとも低レベルの関数です。

ミニバッファーを使用して1文字を読み取る関数が必要ならread-char-from-minibufferを使用してください(複数の問いを尋ねるを参照)。

Function: read-event &optional prompt inherit-input-method seconds

この関数はコマンド入力の次のイベントを読み取ってリターンする。必要ならイベントが利用可能になるまで待機する。

リターンされるイベントはユーザーからの直接のイベントかもしれないし、キーボードマクロからのイベントかもしれない。イベントはキーボードの入力コーディングシステム(端末I/Oのエンコーディングを参照)によりデコードされていない。

オプション引数promptが非nilなら、それはエコーエリアにプロンプトとして表示される文字列。 promptnilか文字列‘""’なら、read-eventは入力待ちを示すメッセージを何も表示せず、エコーを行うことによってプロンプトの代用とする。エコーに表示される記述はカレントコマンドに至ったイベントや読み取られたイベント。エコーエリアを参照のこと。

inherit-input-methodが非nilなら、(もしあれば)非ASCII文字の入力を可能にするためにカレントの入力メソッドが採用される。それ以外では、このイベントの読み取りにたいして入力メソッドの処理が無効になる。

cursor-in-echo-areaが非nilの場合、read-eventはカーソルを一時的にエコーエリアの、そこに表示されているメッセージの終端に移動する。それ以外では、read-eventはカーソルを移動しない。

secondsが非nilなら、それは入力を待つ最大秒数を指定する数値である。その時間内に入力が何も到着しなければ、read-eventは待機を終えてnilをリターンする。浮動小数点数secondsは待機する秒の分数を意味する。いくつかのシステムではサポートされるのは整数の秒数だけであり、そのようなシステムではsecondsは切り捨てられる。secondsnilなら、read-eventは入力が到着するのに必要なだけ待機する。

secondsnilならユーザー入力が到着するのを待つ間、Emacsはアイドル状態にあるとみなされる。この期間中にアイドルタイマー — run-with-idle-timer (アイドルタイマーを参照) — を実行できる。しかしsecondsが非nilなら、非アイドル状態は変更されずに残る。read-eventが呼び出されたときEmacsが非アイドルだったら、read-eventの処理を通じて非アイドルのままとなる。Emacsがアイドルだった場合(これはアイドルタイマー内部からその呼び出しが行われた場合に起こり得る)は、アイドルのままとまる。

read-eventがヘルプ文字として定義されたイベントを取得すると、ある状況においてはread-eventがリターンせずに直接イベントを処理することがある。ヘルプ関数を参照のこと。その他のスペシャルイベント(special events)(スペシャルイベントを参照)と呼ばれる特定のイベントもread-eventで直接処理される。

以下はread-eventを呼び出してから右矢印キーを押下したとき何が起こるかの例:

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

この関数は文字入力イベントを読み取ってリターンする。ユーザーが文字以外(たとえばマウスクリックやファンクションキー)のイベントを生成した場合には、read-charはエラーをシグナルする。引数はread-eventと同じように機能する。

イベントが修飾子をもつ場合には、Emacsはそれらの解決を試みて対応する文字のコードをリターンする。たとえばユーザーがC-aをタイプすると、関数は文字‘C-a’のASCIIコードである1をリターンする。いくつかの修飾子を文字コードに反映できない場合には、read-charは未解決の修飾子ビットをセットしたままイベントをリターンする。たとえばユーザーがC-M-aをタイプすると、関数は134217729(16進の8000001であり、これはメタ修飾子がセットされた‘C-a’)をリターンする。この値は有効な文字コードではないので、characterpのテストに失敗する(文字コードを参照)。修飾子ビットが削除された文字の復元にはevent-basic-type (イベントの分類を参照)、read-charがリターンした文字イベント内の修飾子をテストするにはevent-modifiersを使用すること。

以下の1つ目の例ではユーザーは文字1(ASCIIコード49)をタイプしている。2つ目の例ではeval-expressionを使用してミニバッファーからread-charを呼び出すキーボード定義を示している。read-charはキーボードマクロの直後の文字1を読み取る。その後にeval-expressionはリターン値をエコーエリアに表示する。

(read-char)
     ⇒ 49

;; M-:を使用して以下を評価するものとする
(symbol-function 'foo)
     ⇒ "^[:(read-char)^M1"
(execute-kbd-macro 'foo)
     -| 49
     ⇒ nil
Function: read-char-exclusive &optional prompt inherit-input-method seconds

この関数は文字入力イベントを読み取ってリターンする。ユーザーが文字イベント以外を生成した場合には、read-char-exclusiveはそれを無視して文字を取得するまで他のイベントを読み取る。引数はread-eventと同じように機能する。リターン値にはread-charのように修飾ビットが含まれるかもしれない。

上記の関数でquitを抑制するものはありません。

Variable: num-nonmacro-input-events

この変数は端末から受信した入力イベント(キーボードマクロにより生成されたイベントは勘定しない)の総数を保持する。

read-key-sequenceと異なり関数read-eventread-charread-char-exclusiveイベントシーケンス変換のためのキーマップで説明した変換を行わないことを強調しておきます。単一キー読み取りでこれらの変換を行う — たとえば端末からファンクションキー(ファンクションキーを参照)、xterm-mouse-modeからマウスイベント(マウスイベントを参照)を読み取る場合 — には関数read-keyを使用してください。

Function: read-key &optional prompt disable-fallbacks

この関数は1つのキーを読み取る。これはread-key-sequenceread-eventの間の中間的な関数である。read-key-sequenceと異なるのは、キーシーケンスではなく単一キーを読み取ることである。read-eventと異なるのは、rawイベントをリターンせずにinput-decode-maplocal-function-key-mapkey-translation-map (イベントシーケンス変換のためのキーマップを参照)に合わせてデコードと変換を行うことである。

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

引数disable-fallbacksが非nilなら、read-key-sequenceでバインドされないキーにたいする通常のフォールバックロジックは適用されない。これはbutton-downちmulti-clickのイベントは棄却されず、local-function-key-mapkey-translation-mapが適用されないことを意味する。nilまたは指定されなければ、フォールバックの無効化は最後のイベントのダウンキャスト(訳注: 基本イベントから継承イベントへの型変換)となる。

Function: read-char-choice prompt chars &optional inhibit-quit

この関数はcharsのメンバーであるような文字を読み取って1文字をリターンするためにread-from-minibufferを使用する。charsのメンバーではない文字が入力されると、その旨を伝えるメッセージして入力を破棄する。

オプション引数inhibit-quitはデフォルトでは無視されるが、変数read-char-choice-use-read-keyが非nilならこの関数はread-from-minibufferではなくread-keyを使用する。この場合にはinhibit-quitが非nilだと、有効な入力待機中のkeyboard-quitイベントを無視することを意味する。加えてread-char-choice-use-read-keyが非nilの場合には、この関数の呼び出し中にhelp-formに非nil値をバインドすることによって、ユーザーがhelp-char文字を押下した際にhelp-formを評価してその結果を表示、その後は有効な入力文字、あるいはkeyboard-quitの待機を継続する。

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

複数の選択肢のある問いをユーザーに尋ねる。promptはプロンプトとして表示する文字列であること。

choicesは各エントリーの1つ目の要素が入力される文字、2つ目の要素がプロンプトを表示する際にそのエントリーにたいして表示する短い名前であるようなalist(スペースがあれば短縮され得る)であり、3つ目のオプションのエントリーはユーザーがより多くのヘルプを要求した際にヘルプバッファーに表示する長い説明。

オプション引数help-stringが非nilなら、すべてのchoiceをより詳細に記述する文字列であること。これはユーザーが?をタイプした際に、自動生成されたデフォルトの説明のかわりとしてヘルプバッファーに表示される。

オプション引数show-helpが非nilなら、ユーザーが入力する前に即座にヘルプバッファーが表示される。文字列ならそれがヘルプバッファーの名前として用いられる。

オプション引数long-formが非nilなら、ユーザーは単一キーではなく(completing-readを使用して)長い形式をタイプして応答する必要がある。この応答はリストchoicesの2つ目の要素内に存在しなければならない。

リターン値はchoicesのマッチする値。

(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フェイスが使用される。