プレフィクスキー(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にたいするグローバルキーマップである。このマップは実際にはモード特有(mode-specific)ではなくグローバルであるが、このプレフィクスキーは主にモード特有なバインディングに使用されるので、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-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を用意する。これはsparseキーマップを作成してそれをsymbolの関数定義として格納する。その後はsymbolにキーシーケンスをバインディングすると、そのキーシーケンスはプレフィクスキーになるだろう。リターン値はsymbol
。
この関数は値がそのキーマップであるような変数としてもsymbolをセットする。しかしmapvarが非nil
なら、かわりにmapvarを変数としてセットする。
promptが非nil
なら、これはそのキーマップにたいするoverallプロンプト文字列になる。プロンプト文字列はメニューキーマップにたいして与えらること(メニューの定義を参照)。