次: , 前: Prefix Keys, 上: Keymaps


21.6 活性なキーマップ

Emacsには、通常、たくさんのキーマップがあります。 ある時点では、それらの数個が活性になっていて、 ユーザー入力の解釈に関与します。 それらは、グローバルキーマップ、カレントバッファのローカルキーマップ、 オンになっているマイナモードのキーマップです。

グローバルキーマップ(global keymap)は、 C-fのようなカレントバッファに依存せずに 定義されたキーのバインディングを保持します。 変数global-mapはこのキーマップを保持していて、 このキーマップはつねに活性です。

各バッファには別のキーマップ、つまり、 バッファのローカルキーマップ(local keymap)があり、 キーに対する新しい定義や無効にする定義を保持しています。 カレントバッファのローカルキーマップは、 overriding-local-mapで無効にしない限り、つねに活性です。 テキスト属性により、バッファの特定部分に対する 代替ローカルマップを指定できます。 Special Propertiesを参照してください。

各マイナモードもキーマップを持てます。 その場合、マイナモードがオンであると当該キーマップは活性です。

変数overriding-local-mapnil以外であると、 バッファのローカルキーマップとそのすべてのマイナモードキーマップに 取ってかわるローカルキーマップを指定します。

キーが入力されるとどのコマンドを実行するかを決定するために、 すべての活性なキーマップを一緒に使います。 Emacsは、キーマップの1つでバインディングがみつかるまで、 優先順位が高いほうからこれらのキーマップを1つ1つ探索します。 1つのキーマップで探索する処理のことを キー探索(key lookup)といいます。 Key Lookupを参照してください。

通常、Emacsはまずminor-mode-map-alistで指定される順に マイナモードキーマップでキーを探します。 キーに対するバインディングがなければ、 Emacsはローカルキーマップで探します。 そこにもバインディングがなければ、 Emacsはグローバルキーマップで探します。 しかし、overriding-local-mapnil以外であれば、 Emacsはまずそのキーマップで探してから、 グローバルキーマップで探します。

同じメジャーモードを使う各バッファは、通常、同じローカルキーマップを 使うので、キーマップはモードにローカルであると考えることができます。 (たとえばlocal-set-keyを使って)バッファのローカルキーマップを 修正すると、当該キーマップを共有している別のバッファでも その修正が見えます。

Lispモードや他の数個のメジャーモードで使われるローカルキーマップは、 それらのモードがまだ使われていなくても存在します。 そのようなローカルキーマップは、lisp-mode-mapなどの変数の値です。 使用頻度の低いほとんどのメジャーモードでは、 セッションで始めてそのモードを使ったときに ローカルキーマップを作成します。

ミニバッファにもローカルキーマップがあります。 それにはさまざまな補完コマンドや脱出コマンドが含まれます。 See Intro to Minibuffers

Emacsには、別の用途のキーマップもあります。 read-key-sequenceでイベントを変換するためのものです。 See Translating Input

標準的なキーマップの一覧についてはSee Standard Keymaps

— 変数: global-map

この変数は、Emacsがキーボード入力をコマンドに対応させるための デフォルトのグローバルキーマップを保持する。 グローバルキーマップは、通常、このキーマップである。 デフォルトのグローバルキーマップは、 すべての印字文字にself-insert-commandをバインドする 完全なキーマップである。

グローバルマップのバインディングを修正することは実用的ですが、 この変数には、動作開始時のキーマップ以外の値は設定しないこと。

— 機能: current-global-map

この関数は、現在のグローバルキーマップを返す。 global-mapを変更していなければ、 これはglobal-mapの値と同じである。

          (current-global-map)
          => (keymap [set-mark-command beginning-of-line ...
                      delete-backward-char])
     
— 機能: current-local-map

この関数は、カレントバッファのローカルキーマップを返す。 なければnilを返す。 つぎの例では、(lisp対話モードを使っている)バッファ`*scratch*'の キーマップは疎なキーマップであり、 ASCIIコード27の<ESC>に対する指定も別の疎なキーマップである。

          (current-local-map)
          => (keymap
              (10 . eval-print-last-sexp)
              (9 . lisp-indent-line)
              (127 . backward-delete-char-untabify)
              (27 keymap
                  (24 . eval-defun)
                  (17 . indent-sexp)))
     
— 機能: current-minor-mode-maps

この関数は、現在オンになっているマイナモードのキーマップのリストを返す。

— 機能: use-global-map keymap

この関数は、キーマップkeymapを新たな現在のグローバルキーマップとする。 これはnilを返す。

グローバルキーマップを変更することは、とうてい普通のことではない。

— 機能: use-local-map keymap

この関数は、キーマップkeymapをカレントバッファの 新たなローカルキーマップとする。 keymapnilであると、 バッファにはローカルキーマップがなくなる。 use-local-mapnilを返す。 ほとんどのメジャーモードコマンドは、この関数を使う。

— 変数: minor-mode-map-alist

この変数は、変数の値に応じて活性になっている/いないキーマップを 記述する連想リストである。 その要素はつぎの形である。

          (variable . keymap)
     

変数variableの値がnil以外であれば、 キーマップkeymapは活性である。 典型的には、variableはマイナモードをオン/オフする変数である。 see Keymaps and Minor Modes

minor-mode-map-alistの要素とminor-mode-alistの要素とは、 異なる構造であることに注意してほしい。 キーマップは要素のcdrである必要があり、 要素のcadrがキーマップであるようなリストではだめである。 cadrは、(リストの)キーマップであるか、 関数定義がキーマップであるシンボルである。

複数のマイナモードキーマップが活性な場合、 それらの優先順位は、minor-mode-map-alistでの順番である。 読者は、互いに干渉しないようにマイナモードを設計する必要がある。 正しくできていれば、順序は関係ないはずである。

マイナモードについて詳しくはKeymaps and Minor Modesを参照。 minor-mode-key-binding(see Functions for Key Lookup)も参照のこと。

— 変数: minor-mode-overriding-map-alist

この変数は、メジャーモードから特定のマイナモード向けのキーバインディングを 無効にするためのものである。 この連想リストの要素は、minor-mode-map-alistの要素と同じ形で、 (variable . keymap)である。

minor-mode-overriding-map-alistの要素として変数が現れると、 当該要素が指定するキーマップで、 minor-mode-map-alist内の同じ変数で指定したキーマップを 完全に置き換える。

minor-mode-overriding-map-alistは、すべてのバッファにおいて、 自動的にバッファにローカルになる。

— 変数: overriding-local-map

nil以外の値であると、この変数は、 バッファのローカルキーマップ、ならびに、すべてのマイナモードキーマップの かわりに用いるキーマップを保持する。 このキーマップは、現在のグローバルキーマップを除く、 他のすべての活性なキーマップを無効にする。

— 変数: overriding-terminal-local-map

nil以外であると、この変数は、 overriding-local-map、および、バッファのローカルキーマップと すべてのマイナモードキーマップのかわりに用いるキーマップを保持する。

この変数はつねに現在の端末に対してローカルであり、 バッファに対してローカルにはならない。 see Multiple Displays。 これはインクリメンタルサーチモードの実装に使われている。

— 変数: overriding-local-map-menu-flag

この変数がnil以外であれば、 overriding-local-mapoverriding-terminal-local-mapの値は、 メニューバーの表示に影響する。 デフォルト値はnilであり、 そのため、それらのマップはメニューバーには影響しない。

これら2つのキーマップ変数は、メニューバーの表示に影響しないときであっても、 メニューバーを用いて入力したキー列の実行には影響することに注意してほしい。 そのため、メニューバーのキー列が到着したら、 そのキー列を探索し実行するまえに、これらの変数をクリアすべきである。 これらの変数を使うモードでは、典型的にはつぎのようにする。 つまり、モードで処理できないイベントは『読み戻し』てモードから抜ける。

— 変数: special-event-map

この変数は特殊イベント用のキーマップを保持する。 イベント型のバインディングがこのキーマップにあれば、 そのイベントは特殊イベントであり、 read-eventが当該イベントのバインディングを直接実行する。 see Special Events