2025-11-29

よく分かるEmacs Lisp入力関数関連図

Emacsのキー入力関数ってなんか似たような名前が多くてすぐに理解できませんよね。調べてだいたい分かったつもりになっていても、しばらくしたら忘れている自信があります。なので図にしておきました。自分のために。

read_charread_key_sequenceread_key_sequence_vsread-key-sequenceread-key-sequence-vectorread_filtered_eventread-eventread-charread-char-exclusivecommand_looprecursive_edit_1read_minibufread-from-minibuffercompleting-read-defaultcompleting-readread-multiple-choiceread-keyread-char-choiceread-quoted-charx-popup-dialoglread.ckeyboard.csubr.elminibuf.c/minibuffer.elrmc.elsimple.elcompleting-read-functionmenu.c

Emacs Lisp リファレンスマニュアルで言うと「Reading Input (GNU Emacs Lisp Reference Manual)」に書いてある関数のことです。

Reading Input (GNU Emacs Lisp Reference Manual)

大別すると read_filtered_event を介して直接的に一つのイベントを読み取る関数群と、 read_key_sequence を介してキーマップによって決まる一続きのキー列を読み取る関数群とに分けられるようです。普段バッファの中で使っているのは後者ですね。コマンドループを通じて read_key_sequence を呼び出しています。それだけに read_key_sequence の方が複雑で難しいです。

read_filtered_event 系には三つの関数がありますが、文字入力イベントのみに限定するバージョン(read-charread-char-exclusive)と全てのイベントを読み取るバージョン(read-event)に分かれます。 read-charread-char-exclusive の違いは、文字以外のイベントが来たときにエラーにするか、排除して続行するかの違いです。

  • read_filtered_event
    • 文字のみ
      • 文字以外でエラー : read-char
      • 文字以外は無視 : read-char-exclusive
    • 全て : read-event

read-charread-char-exclusive は、 read-event に比べると次の処理が加わっています。

  • text-conversionの無効化と復元 (Androidの場合IMEによって直接バッファを書き替える仕組みが存在します)
  • 非文字イベント発生時のエラー(read-char)またはリトライ(read-char-exclusive)
  • switch-frameイベントの遅延 (非文字イベントだが特別扱い)
  • イベントタイプシンボルの文字コード化 (例えばtabを9にします)
  • 修飾キービットの正規化 (主にshiftとcontrolの処理です。例えば25ビット目(?\S-\0)が立っていてベース文字がアルファベット小文字なら大文字にしてビットを消します。control(26ビット目)が立っている文字を制御文字へ変換したりもします)

当然ですが read_filtered_event 系関数にはキーマップは作用しません。

read_filtered_eventread_key_sequence に共通な処理も read_char の中に色々入っています。 unread-command-events の処理とかキーマクロの再現に関するものとか。