イベント読み取り関数は、現在の入力メソッドがあればそれを呼び出します(入力メソッドを参照)。input-method-function の値が nil
以外の場合は関数である必要があり、read-event が修飾ビットのない印字文字(SPC を含む)を読み取る際は、その文字を引数として渡して当該関数を呼び出します。
これが non-nil の場合、その値は現在の入力メソッド関数を指定します。
警告: この変数を let
でバインドしないでください。この変数はバッファローカルである場合が多く、入力の読み取り前後でバインドすると(まさにそのようなタイミングでバインドしがちですが)、Emacs
が待機している間に非同期でバッファを切り替えた際、値が誤ったバッファに復元されてしまいます。
入力メソッド関数は、入力として使用されるイベントのリストを返す必要があります。(リストが nil
の場合は入力がないことを意味するため、read-event
は別のイベントを待機します。)これらのイベントは、unread-command-events
内のイベントよりも先に処理されます(その他のイベント入力機能を参照)。入力メソッド関数によって返されたイベントは、たとえ修飾ビットのない文字を出力する場合であっても、再度入力メソッド関数に渡されることはありません。
入力メソッド関数が read-event または read-key-sequence を呼び出す場合は、再帰を防ぐため、まず input-method-function を nil
にバインドすべきである。
キーシーケンスの2番目以降のイベントを読み取る際、入力メソッド関数は呼び出されません。したがって、これらの文字は入力メソッドによる処理の対象となりません。入力メソッド関数は
overriding-local-map と overriding-terminal-local-map の値を判定し、いずれかの変数が nil 以外である場合は、その引数をリストに格納し、さらなる処理を行うことなくそのリストを返す必要があります。