次: Active Keymaps, 前: Inheritance and Keymaps, 上: Keymaps
プレフィックス(prefix key)とは、
そのバインディングがキーマップであるキー列のことです。
そのキーマップが、プレフィックスキー以降のキーでなにをするかを定義します。
たとえば、C-xはプレフィックスキーであり、
変数ctl-x-mapに保持されたキーマップを使います。
このキーマップは、C-xで始まるキー列に対するバインディングを定義します。
Emacsの標準プレフィックスキーのなかには、 Lisp変数にも保持されたキーマップを使うものがあります。
esc-mapは、プレフィックスキー<ESC>用のグローバルマップである。
したがって、すべてのメタ文字のグローバルな定義はここにある。
このキーマップはESC-prefixの関数定義でもある。
help-mapは、プレフィックスキーC-hに対する
グローバルキーマップである。
mode-specific-mapは、プレフィックスキーC-cに対する
グローバルキーマップである。
このキーマップは実際にはグローバルでありモード固有ではないが、
その名前は、C-h b(display-bindings)の出力において
C-cに関する有用な情報を与える。
というのは、このプレフィックスキーの主な用途は、
モード固有のバインディングのためだからである。
ctl-x-mapは、プレフィックスキーC-xに対して使われる
グローバルキーマップである。
このキーマップは、シンボルControl-X-prefixの関数セルに現れる。
mule-keymapは、プレフィックスキーC-x <RET>に対して使われる
グローバルキーマップである。
ctl-x-4-mapは、プレフィックスキーC-x 4に対して使われる
グローバルキーマップである。
ctl-x-5-mapは、プレフィックスキーC-x 5に対して使われる
グローバルキーマップである。
2C-mode-mapは、プレフィックスキーC-x 6に対して使われる
グローバルキーマップである。
vc-prefix-mapは、プレフィックスキーC-x vに対して使われる
グローバルキーマップである。
facemenu-keymapは、プレフィックスキーM-gに対して使われる
グローバルキーマップである。
プレフィックスキーのキーマップバインディングは、
当該プレフィックスキーに続くイベントを探すために使われます。
(その関数定義がキーマップであるシンボルでもよい。
効果は同じであるが、シンボルはプレフィックスキーに対する名前として働く。)
したがって、C-xのバインディングは
シンボルControl-X-prefixであり、
その関数セルがコマンドC-x用のキーマップを保持している。
(ctl-x-mapの値も同じキーマップである。)
プレフィックスキーの定義は、任意の活性なキーマップにあってかまいません。 プレフィックスキーとしてのC-c、C-x、C-h、<ESC>の 定義はグローバルマップにあるので、これらのプレフィックスキーは つねに利用できます。 メジャーモードやマイナモードでは、 プレフィックスキーの定義をローカルキーマップや マイナモードキーマップに入れることで、 キーをプレフィックスとして再定義できます。 See Active Keymaps。
複数の活性なキーマップにおいて、キーがプレフィックスと定義されていると、 さまざまな定義は実質的には併合されます。 マイナモードキーマップで定義されたコマンドが最優先で、 つぎにローカルマップのプレフィックス定義、 そしてグローバルマップのプレフィックス定義が続きます。
以下の例では、ローカルキーマップにおいて、
C-pをC-xに等価なプレフィックスキーにします。
続いてC-p C-fのバインディングを
C-x C-fのように関数find-fileにします。
キー列C-p 6はどの活性なキーマップでもみつかりません。
(use-local-map (make-sparse-keymap))
=> nil
(local-set-key "\C-p" ctl-x-map)
=> nil
(key-binding "\C-p\C-f")
=> find-file
(key-binding "\C-p6")
=> nil