Hatena::Groupemacs

はてなグループEmacs@kiwanami

2011-06-06

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

03:44

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

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 とかぐらい)。

KeliKeli2011/10/07 05:28Kudos to you! I hadn't thohugt of that!