Next: , Previous: Inheritance and Keymaps, Up: Keymaps


21.5 プレフィックスキー

プレフィックス(prefix key)とは、 そのバインディングがキーマップであるキー列のことです。 そのキーマップが、プレフィックスキー以降のキーでなにをするかを定義します。 たとえば、C-xはプレフィックスキーであり、 変数ctl-x-mapに保持されたキーマップを使います。 このキーマップは、C-xで始まるキー列に対するバインディングを定義します。

Emacsの標準プレフィックスキーのなかには、 Lisp変数にも保持されたキーマップを使うものがあります。

プレフィックスキーのキーマップバインディングは、 当該プレフィックスキーに続くイベントを探すために使われます。 (その関数定義がキーマップであるシンボルでもよい。 効果は同じであるが、シンボルはプレフィックスキーに対する名前として働く。) したがって、C-xのバインディングは シンボルControl-X-prefixであり、 その関数セルがコマンドC-x用のキーマップを保持している。 (ctl-x-mapの値も同じキーマップである。)

プレフィックスキーの定義は、任意の活性なキーマップにあってかまいません。 プレフィックスキーとしてのC-cC-xC-h、<ESC>の 定義はグローバルマップにあるので、これらのプレフィックスキーは つねに利用できます。 メジャーモードやマイナモードでは、 プレフィックスキーの定義をローカルキーマップや マイナモードキーマップに入れることで、 キーをプレフィックスとして再定義できます。 See Active Keymaps

複数の活性なキーマップにおいて、キーがプレフィックスと定義されていると、 さまざまな定義は実質的には併合されます。 マイナモードキーマップで定義されたコマンドが最優先で、 つぎにローカルマップのプレフィックス定義、 そしてグローバルマップのプレフィックス定義が続きます。

以下の例では、ローカルキーマップにおいて、 C-pC-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
— Function: define-prefix-command symbol

この関数は、symbolをプレフィックスキーの バインディングとして使えるように準備する。 つまり、完全なキーマップを作成し、 symbolの関数定義にそのキーマップを保存する。 以後、symbolにキー列をバインドすると、 当該キー列をプレフィックスキーに入る。

この関数は、変数としてのsymbolにも値としてキーマップを設定する。 symbolを返す。