各キーマップは、CAR がシンボル keymap
であるリストです。リストの残りの要素が、そのキーマップのキーバインドを定義します。関数定義がキーマップであるシンボルもまた、キーマップとなります。オブジェクトがキーマップであるかどうかを判定するには、関数
keymapp(後述)を使用してください。
キーマップでは、開始記号 keymap の後に、数種類の要素が現れることがあります:
(type . binding)これは、type 型のイベントに対する1つのバインディングを指定します。各通常のバインディングは、特定のイベント型(常に文字または記号)のイベントに適用されます。イベントの分類を参照してください。この種のバインディングにおいて、binding はコマンドです。
(type item-name . binding)これは、メニュー内で item-name として表示されるシンプルなメニュー項目でもあるバインディングを指定します。シンプルなメニュー項目を参照してください。
(type item-name help-string . binding)これはヘルプ文字列 help-string を持つシンプルなメニュー項目です。
(type menu-item . details)これは、拡張メニュー項目でもあるバインディングを指定します。これにより、他の機能を利用できるようになります。拡張メニュー項目を参照してください。
(t . binding) ¶これはデフォルトのキーバインドを指定します。キーマップの他の要素でバインドされていないイベントには、binding
がバインドとして割り当てられます。デフォルトのバインドを利用することで、キーマップは考えられるすべてのイベントタイプを個別に列挙することなく、それらすべてをバインドできます。デフォルトのバインドを持つキーマップは、nil に明示的にバインドされたイベント(後述)を除き、優先度の低いあらゆるキーマップを完全に上書きします。
char-tableキーマップの要素が文字テーブルである場合、修飾ビットを持たないすべての文字イベントに対するバインディングを保持しているものとみなされます(修飾ビットを参照)。インデックスがcの要素は、文字cに対するバインディングとなります。これは、多数のバインディングをコンパクトに記録する方法です。このような文字テーブルを持つキーマップは、フルキーマップと呼ばれます。それ以外のキーマップは、スパースキーマップと呼ばれます。
vectorこの種の要素は文字テーブルに似ており、インデックスが c の要素が文字 c のバインディングとなります。このようにバインドできる文字の範囲はベクトルサイズによって制限されており、またベクトルの生成時には 0 から始まるすべての文字コード分の領域が割り当てられるため、この形式は、バインディング自体を問わないメニューキーマップ(メニューキーマップ を参照)の作成以外では使用すべきではありません。
string ¶キーへのバインドを指定する要素のほかに、キーマップには文字列を要素として含めることもできます。これは全体プロンプト文字列と呼ばれ、キーマップをメニューとして利用することを可能にします。メニューの定義を参照してください。
(keymap …)キーマップの要素自体がキーマップである場合、その内部キーマップが外部キーマップにインライン展開されたものとしてカウントされます。これは、make-composed-keymap のような多重継承で使用されます。
バインディングが nil
の場合、それは定義とはなりませんが、デフォルトのバインディングや親キーマップ内のバインディングよりも優先されます。一方、nil のバインディングは、優先度の低いキーマップを上書きしません。したがって、ローカルマップに nil
のバインディングが指定されている場合、Emacs はグローバルマップのバインディングを使用します。
キーマップでは、メタ文字のバインディングを直接記録しません。代わりに、キー検索の際にはメタ文字は2文字のシーケンスとして扱われ、その先頭は ESC(またはその時点での meta-prefix-char
の値)となります。したがって、キー M-a は内部的に ESC a として表現され、そのグローバルバインディングは esc-map 内の a のスロットで見つかります(プレフィックスキー を参照)。
この変換は文字にのみ適用され、ファンクションキーやその他の入力イベントには適用されません。したがって、M-end は ESC end とは無関係です。
例として、Lispモードのローカルキーマップ(スパースなキーマップ)を挙げます。ここでは DEL、C-c C-z、C-M-q、C-M-x のバインドが定義されています(実際の値にはメニューバインドも含まれていますが、簡潔にするためここでは省略しています)。
lisp-mode-map ⇒
(keymap
(3 keymap
;; C-c C-z
(26 . run-lisp))
(27 keymap
;; C-M-x, treated as ESC C-x
(24 . lisp-send-defun))
;; This part is inherited from lisp-mode-shared-map.
keymap
;; DEL
(127 . backward-delete-char-untabify)
(27 keymap
;; C-M-q, treated as ESC C-q
(17 . indent-sexp)))
この関数は、object がキーマップであれば t
を、そうでなければ nil を返します。より正確には、この関数は、CAR が keymap であるリスト、または関数定義が
keymapp を満たすシンボルを判定します。
(keymapp '(keymap))
⇒ t
(fset 'foo '(keymap))
(keymapp 'foo)
⇒ t
(keymapp (current-global-map))
⇒ t