プレフィックスキーとは、バインド先がキーマップであるキーシーケンスのことです。キーマップは、プレフィックスキーに続くキーシーケンスをどのように処理するかを定義します。例えば、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
プレフィックスキーに使用されるグローバルキーマップです。
tab-prefix-map は、C-x t
プレフィックスキーに使用されるグローバルキーマップです。
vc-prefix-map は、C-x v
プレフィックスキーに使用されるグローバルキーマップです。
goto-map は、M-g プレフィックスキーに使用されるグローバルキーマップです。
search-map は、M-s プレフィックスキーに使用されるグローバルキーマップです。
プレフィックスキーのキーマップバインディングは、そのプレフィックスキーに続くイベントを参照するために使用されます。(代わりに、関数定義がキーマップであるシンボルが指定される場合もあります。効果は同じですが、そのシンボルがプレフィックスキーの名称として機能します。)したがって、C-x のバインディングはシンボル Control-X-prefix であり、その関数セルには C-x
コマンド用のキーマップが格納されています。(同じキーマップが ctl-x-map
の値でもあります。)
プレフィックスキーの定義は、任意のアクティブなキーマップに記述できます。C-c、C-x、C-h、ESC のプレフィックスキーとしての定義はグローバルマップに存在するため、これらのプレフィックスキーは常に利用可能です。メジャーモードやマイナーモードでは、ローカルマップまたはマイナーモードのマップにプレフィックスキーの定義を記述することで、キーをプレフィックスとして再定義できます。アクティブキーマップを参照してください。
あるキーが複数のアクティブなマップでプレフィックスとして定義されている場合、それらの定義は実質的に統合されます。まずマイナーモードのキーマップで定義されたコマンドが適用され、次にローカルマップのプレフィックス定義、最後にグローバルマップの定義が適用されます。
以下の例では、ローカルキーマップにおいて C-p をプレフィックスキーとし、C-p が C-x と同一になるように設定します。すると、C-p C-f のバインドは、C-x C-f と同様に関数 find-file となります。対照的に、キーシーケンス C-p
9 はいずれのアクティブなキーマップにも見当たりません。
(use-local-map (make-sparse-keymap))
⇒ nil
(keymap-local-set "C-p" ctl-x-map)
⇒ (keymap #^[nil nil keymap ...
(keymap-lookup nil "C-p C-f")
⇒ find-file
(keymap-lookup nil "C-p 9")
⇒ nil
この関数は、symbol
をプレフィックスキーのバインドとして使用できるように準備します。具体的には、スパースなキーマップを作成し、それを symbol の関数定義として格納します。その後、キーシーケンスを symbol にバインドすることで、そのキーシーケンスがプレフィックスキーになります。戻り値は symbol です。
この関数はまた、キーマップを値としてsymbolを変数に設定します。ただし、mapvarがnilでない場合は、代わりにmapvarを変数に設定します。
prompt が nil
以外の場合、それがキーマップ全体のプロンプト文字列となります。メニューキーマップの場合は、プロンプト文字列を指定する必要があります(メニューの定義を参照してください)。