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

Date: 2020-05-26
URL: https://s.conao3.com/blog/2020/40023a
Author: conao3 (Naoya Yamashita)

[元記事](http://emacs.g.hatena.ne.jp/kiwanami/20110606/1307385847)の[アーカイブ](https://web.archive.org/web/20110612063312/http://emacs.g.hatena.ne.jp/kiwanami/20110606/1307385847)のアーカイブ。なにか問題があれば教えて下さい。以下、アーカイブ。

---

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

![img](https://s.conao3.com/img/40023a-ab13cfa3-d618-4e84-836a-d4a272a0e1c8.png)

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

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

# 基本

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

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

テキストには文字単位で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とかぐらい)。
