Next: , Previous: , Up: Keymaps   [Contents][Index]


21.5 継承とキーマップ

キーマップは他のキーマップを継承することができ、この継承元のキーマップを親キーマップ(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を使用するようにプログラムを変更してください。

Function: keymap-parent keymap

これはkeymapの親キーマップをリターンする。keymapに親キーマップがなければkeymap-parentnilをリターンする。

Function: set-keymap-parent keymap parent

これはkeymapの親キーマップをparentにセットしてparentをリターンする。parentnilならこの関数は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が使用できます。

Function: make-composed-keymap maps &optional parent

この関数は既存のキーマップから構成される新たなキーマップをリターンする。またオプションで親キーマップparentから継承を行う。mapsには単一のキーマップ、または複数のキーマップのリストを指定できる。リターンされた新たなマップ内でキーをルックアップするとき、Emacsはmaps内のキーマップを順に検索してからparent内を検索する。この検索は最初のマッチで停止する。mapsのいずれか1つのキーマップ内のnilバインディングは、parent内のすべてのバインディングをオーバーライドするが、mapsにないキーマップの非nilなバインディングはオーバーライドしない。

たとえば以下はbutton-buffer-mapspecial-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) ... )