Emacsのキーマップlookup順序について

元記事アーカイブのアーカイブ。なにか問題があれば教えて下さい。以下、アーカイブ。


何となく忘れてしまうのでメモ。

Info の 22.8 Searching the Active Keymaps, 22.9 Controlling the Active Keymaps などから。

「belong」は誰がその変数を管理するかとか、変数の所属先という感じ。

基本

全バッファ共通は global-map 、メジャーモードは local-map を設定する。

マイナーモードはまとめて minor-mode-map-alist に入っていて、マイナーモードの変数が onoff で有効無効が決まる。 このリストの順番も重要。

テキストには文字単位で keymap と言う属性をつけて、キーバインドを設定できる。

あと、これらのどれにもヒットしなければ、 local-function-key-map でキーの変換が行われる。 例えば、環境によって C-i (タブ文字) と <tab> は区別されているが、実質は同じと見なした方が便利なのでここで変換される。

優先順位は見たまま。 text-property 'keymap > minor-mode-map-alist > local-map > global-map > local-function-key-map

override

この優先順位を少し覆すことが出来るしくみが overriding 関係。 CSS の important! のような感じ。

まず、メジャーモードよりマイナーモードの方が優先されてしまうので、これを覆す仕組みが minor-mode-overriding-map-alist 。 ただ、覆そうとしているマイナーモードの名前を知らないといけない。

次に、文字単位の keymap をメジャーモードやマイナーモードから覆す仕組みが overriding-local-map

最後に、端末入力の最上位で入力を乗っ取る仕組みが overriding-terminal-local-map 。 これは影響範囲がその端末だけ。

emulation-mode-map-alists は他のメジャーモードやマイナーモードが別のモードのキーマップを乗っ取ったり、 remap で挙動を変えたりする場合に使うもの。 検索してもあまり情報がない (cua, viper とかぐらい)。