Next: Prefix Keys, Previous: Creating Keymaps, Up: Keymaps [Contents][Index]
キーマップは、他のキーマップを継承することができ、この継承元のキーマップを親キーマップ(parent keymap)と呼びます。そのようなキーマップは、以下のようなキーマップです:
(keymap elements… . parent-keymap)
これの効果は、このキーマップがキールックアップ時にparent-keymapのすべてのバインディングを継承するが、それらにバインディングを追加したり、elementsでオーバーライドできるということです。
define-key
や他のキーバインディング関数を使用してparent-keymap内のバインディングを変更した場合、変更されたバインディングはelementsで作られたバインディングにshadowされない限り、継承されたキーマップ内で可視になります。逆は真ではありません。define-key
を使用して継承されたキーマップ内のバインディングを変更した場合、これらの変更は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)
非sparseキーマップも親キーマップをもつことができますが、便利とは言えません。非sparseキーマップは、修飾ビットをもたないすべての数値文字コードにたいするバインディングとして、たとえそれがnil
であっても常に何かを指定するので、これらの文字のバインディングが親キーマップから継承されることは決してないのです。
複数のマップからキーマップを継承したいときがあるかもしれません。これにたいしては、関数make-composed-keymap
が使用できます。
この関数は、既存のキーマップから構成される新たなキーマップをリターンする。また、オプションで親キーマップparentから継承する。mapsには単一のキーマップ、または複数のキーマップのリストを指定できる。リターンされた新たなマップ内でキーをルックアップするとき、Emacsはmaps内のキーマップを順に検索してからparent内を検索する。この検索は最初のマッチで停止される。mapsのどれか1つのキーマップ内のnil
バインディングは、parent内の任意のバインディングをオーバーライドするが、mapsにないキーマップの非nil
バインディングはオーバーライドしない。
For example, here is how Emacs sets the parent of
【FIXME】たとえば、以下はbutton-buffer-map
とspecial-mode-map
の両方を継承するhelp-mode-map
のようなキーマップの親キーマップをEmacsがセットする方法です:
(defvar help-mode-map (let ((map (make-sparse-keymap))) (set-keymap-parent map (make-composed-keymap button-buffer-map special-mode-map)) ... map) ... )