キーマップは、別のキーマップ(これを親キーマップと呼びます)のバインディングを継承できます。このようなキーマップは次のようになります。
(keymap elements... . parent-keymap)
これにより、このキーマップは、キー参照時にどのような割り当てがなされていようとも parent-keymap のすべてのバインドを継承し、さらに elements を用いてそれらに追記したり上書きしたりできるようになります。
keymap-set やその他のキーバインド関数を用いて parent-keymap のバインドを変更すると、elements
によるバインドで上書きされない限り、変更されたバインドは継承先のキーマップに反映されます。その逆は成り立ちません。つまり、keymap-set を用いて継承先のキーマップのバインドを変更しても、その変更は elements には記録されますが、parent-keymap
には影響しません。
親を持つキーマップを構築する正しい方法は set-keymap-parent
を使用することです。親を持つキーマップを直接構築しているコードがある場合は、代わりに set-keymap-parent を使用するようにプログラムを変換してください。
これは keymap の親キーマップを返します。keymap
に親がない場合は、keymap-parent は nil を返します。
これにより、keymap の親キーマップが parent
に設定され、parent が返されます。parent が
nil である場合、この関数は keymap
に親を一切設定しません。
keymap にサブマップ(プレフィックスキーのバインディング)がある場合、それらにも parent がそれらのプレフィックスキーに対して指定する内容を反映した新しい親キーマップが付与されます。
text-mode-mapを継承するキーマップの作成方法を示す例を以下に挙げます。
(let ((map (make-sparse-keymap))) (set-keymap-parent map text-mode-map) map)
非スパースなキーマップにも親を持たせることは可能ですが、あまり有用ではありません。非スパースなキーマップでは、修飾ビットを持たないすべての数値文字コードに対して、たとえ
nil
であっても常に何らかのバインディングを指定するため、これらの文字のバインディングが親キーマップから継承されることはありません。
複数のマップを継承するキーマップを作成したい場合があります。その際は、make-composed-keymap 関数を使用できます。
この関数は、既存のキーマップ(s) maps で構成され、必要に応じて親キーマップ parent を継承した新しいキーマップを返します。maps
には、単一のキーマップまたは複数のキーマップのリストを指定できます。結果として得られた新しいマップでキーを検索する際、Emacs は maps のそれぞれを順に検索し、次に parent
を検索して、最初に一致したもので停止します。maps のいずれかにある nil のバインディングは、parent
のあらゆるバインディングを上書きしますが、maps の他のいずれにある nil 以外のバインディングを上書きすることはありません。
例えば、Emacsがhelp-mode-mapの親を次のように設定し、button-buffer-mapとspecial-mode-mapの両方を継承させる例を以下に示します。
(defvar-keymap help-mode-map
:parent (make-composed-keymap button-buffer-map
special-mode-map)
...)