Next: Key Lookup, Previous: Prefix Keys, Up: Keymaps
Emacsには、通常、たくさんのキーマップがあります。 ある時点では、それらの数個が活性になっていて、 ユーザー入力の解釈に関与します。 それらは、グローバルキーマップ、カレントバッファのローカルキーマップ、 オンになっているマイナモードのキーマップです。
グローバルキーマップ(global keymap)は、
C-fのようなカレントバッファに依存せずに
定義されたキーのバインディングを保持します。
変数global-map
はこのキーマップを保持していて、
このキーマップはつねに活性です。
各バッファには別のキーマップ、つまり、
バッファのローカルキーマップ(local keymap)があり、
キーに対する新しい定義や無効にする定義を保持しています。
カレントバッファのローカルキーマップは、
overriding-local-map
で無効にしない限り、つねに活性です。
テキスト属性により、バッファの特定部分に対する
代替ローカルマップを指定できます。
Special Propertiesを参照してください。
各マイナモードもキーマップを持てます。 その場合、マイナモードがオンであると当該キーマップは活性です。
変数overriding-local-map
がnil
以外であると、
バッファのローカルキーマップとそのすべてのマイナモードキーマップに
取ってかわるローカルキーマップを指定します。
キーが入力されるとどのコマンドを実行するかを決定するために、 すべての活性なキーマップを一緒に使います。 Emacsは、キーマップの1つでバインディングがみつかるまで、 優先順位が高いほうからこれらのキーマップを1つ1つ探索します。 1つのキーマップで探索する処理のことを キー探索(key lookup)といいます。 Key Lookupを参照してください。
通常、Emacsはまずminor-mode-map-alist
で指定される順に
マイナモードキーマップでキーを探します。
キーに対するバインディングがなければ、
Emacsはローカルキーマップで探します。
そこにもバインディングがなければ、
Emacsはグローバルキーマップで探します。
しかし、overriding-local-map
がnil
以外であれば、
Emacsはまずそのキーマップで探してから、
グローバルキーマップで探します。
同じメジャーモードを使う各バッファは、通常、同じローカルキーマップを
使うので、キーマップはモードにローカルであると考えることができます。
(たとえばlocal-set-key
を使って)バッファのローカルキーマップを
修正すると、当該キーマップを共有している別のバッファでも
その修正が見えます。
Lispモードや他の数個のメジャーモードで使われるローカルキーマップは、
それらのモードがまだ使われていなくても存在します。
そのようなローカルキーマップは、lisp-mode-map
などの変数の値です。
使用頻度の低いほとんどのメジャーモードでは、
セッションで始めてそのモードを使ったときに
ローカルキーマップを作成します。
ミニバッファにもローカルキーマップがあります。 それにはさまざまな補完コマンドや脱出コマンドが含まれます。 See Intro to Minibuffers。
Emacsには、別の用途のキーマップもあります。
read-key-sequence
でイベントを変換するためのものです。
See Translating Input。
標準的なキーマップの一覧についてはSee Standard Keymaps。
この変数は、Emacsがキーボード入力をコマンドに対応させるための デフォルトのグローバルキーマップを保持する。 グローバルキーマップは、通常、このキーマップである。 デフォルトのグローバルキーマップは、 すべての印字文字に
self-insert-command
をバインドする 完全なキーマップである。グローバルマップのバインディングを修正することは実用的ですが、 この変数には、動作開始時のキーマップ以外の値は設定しないこと。
この関数は、現在のグローバルキーマップを返す。
global-map
を変更していなければ、 これはglobal-map
の値と同じである。(current-global-map) (keymap [set-mark-command beginning-of-line ... delete-backward-char])
この関数は、カレントバッファのローカルキーマップを返す。 なければ
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)))
この関数は、キーマップkeymapを新たな現在のグローバルキーマップとする。 これは
nil
を返す。グローバルキーマップを変更することは、とうてい普通のことではない。
この関数は、キーマップkeymapをカレントバッファの 新たなローカルキーマップとする。 keymapが
nil
であると、 バッファにはローカルキーマップがなくなる。use-local-map
はnil
を返す。 ほとんどのメジャーモードコマンドは、この関数を使う。
この変数は、変数の値に応じて活性になっている/いないキーマップを 記述する連想リストである。 その要素はつぎの形である。
(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-map-alist
の要素と同じ形で、(
variable.
keymap)
である。
minor-mode-overriding-map-alist
の要素として変数が現れると、 当該要素が指定するキーマップで、minor-mode-map-alist
内の同じ変数で指定したキーマップを 完全に置き換える。
minor-mode-overriding-map-alist
は、すべてのバッファにおいて、 自動的にバッファにローカルになる。
nil
以外の値であると、この変数は、 バッファのローカルキーマップ、ならびに、すべてのマイナモードキーマップの かわりに用いるキーマップを保持する。 このキーマップは、現在のグローバルキーマップを除く、 他のすべての活性なキーマップを無効にする。
nil
以外であると、この変数は、overriding-local-map
、および、バッファのローカルキーマップと すべてのマイナモードキーマップのかわりに用いるキーマップを保持する。この変数はつねに現在の端末に対してローカルであり、 バッファに対してローカルにはならない。 see Multiple Displays。 これはインクリメンタルサーチモードの実装に使われている。
この変数が
nil
以外であれば、overriding-local-map
やoverriding-terminal-local-map
の値は、 メニューバーの表示に影響する。 デフォルト値はnil
であり、 そのため、それらのマップはメニューバーには影響しない。これら2つのキーマップ変数は、メニューバーの表示に影響しないときであっても、 メニューバーを用いて入力したキー列の実行には影響することに注意してほしい。 そのため、メニューバーのキー列が到着したら、 そのキー列を探索し実行するまえに、これらの変数をクリアすべきである。 これらの変数を使うモードでは、典型的にはつぎのようにする。 つまり、モードで処理できないイベントは『読み戻し』てモードから抜ける。
この変数は特殊イベント用のキーマップを保持する。 イベント型のバインディングがこのキーマップにあれば、 そのイベントは特殊イベントであり、
read-event
が当該イベントのバインディングを直接実行する。 see Special Events。