次: , 前: Key Sequence Input, 上: Reading Input


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

コマンド入力用の最低レベルの関数は、単一イベントを読み取る関数です。

— 機能: read-event &optional prompt suppress-input-method

この関数は、必要ならばイベントの到着を待って、 コマンド入力のつぎのイベントを読み取って返す。 イベントは、ユーザーか(実行中の)キーボードマクロから直接得る。

promptnil以外であると、 これはプロンプトとしてエコー領域に表示される文字列であること。 さもなければ、read-eventは 入力待ちであることを示すメッセージを表示せずに、 そのかわりに、現在のコマンドを実行するに至ったイベントや 現在のコマンドが読み取ったイベントをプロンプトとして表示する。 see The Echo Area

suppress-input-methodnil以外であると、 このイベントの読み取りに関しては現在の入力方式を使わない。 入力方式の処理をせずにイベントを読みたいときには、 つねにこのようにすること。 input-method-functionを束縛してはならない(下記参照)。

変数cursor-in-echo-areanil以外であると、 read-eventは、エコー領域に表示されたメッセージの末尾に カーソルを一時的に移動する。 さもなければ、read-eventはカーソルを移動しない。

read-eventがヘルプ文字と定義されたイベントを受け取ると、 それを返さずにread-eventがイベントを直接処理してしまう場合がある。 see Help Functions特殊イベント(special event)と呼ばれる他のイベントも read-eventが直接処理する(see Special Events)。

read-eventを呼んで右矢印のファンクションキーを押すとつぎのようになる。

          (read-event)
               => right
     
— 機能: read-char

この関数はコマンド入力の文字を読み取りそれを返す。 文字を得るまで、文字以外のイベントはすべて破棄する。

最初の例では、ユーザーは文字1ASCIIコード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
     

read-eventは、あれば現在の入力方式も起動します。 input-method-functionnil以外であれば、 それは関数であるはずです。 read-eventが修飾ビットのない(<SPC>を含む)印字文字を読み取ると、 引数としてイベントを渡してその関数を呼び出します。

— 変数: input-method-function

これがnil以外であると、その値は現在の入力方式関数を指定する。

注意: この変数をletで束縛しないこと。 この変数はしばしばバッファローカルであり、 入力を読む周囲で束縛すると(読者がこれをもっとも束縛しそうなところ)、 Emacsが入力を待っているときにバッファが非同期に切り替わると、 誤ったバッファに値を復元してしまうことがある。

入力方式関数は、入力として使われるイベントのリストを返すべきです。 (リストがnilであると入力がなかったことを意味し、 read-eventは別のイベントを待つ。) これらのイベントは、 unread-command-events内のイベントよりまえに処理されます。 入力方式関数が返したイベントは、それらが修飾ビットがない印字文字であっても、 入力方式関数に再度渡されることはありません。

入力方式関数がread-eventread-key-sequenceを呼び出すときには、 input-method-functionnilに束縛して 再帰呼び出しを防ぐべきです。

キー列の2番目以降のイベントを読むときには、入力方式関数を呼び出しません。 したがって、それらの文字は、入力方式処理の対象ではありません。 入力方式の処理では、 overriding-local-mapoverriding-terminal-local-mapの値を 検査するのがよいです。 これらの変数のいずれかがnil以外であるときには、 入力方式ではその引数をリストに入れ、 それ以上処理せずにそのリストを返すべきです。