GNU Emacs 32.0.50 (9008bf64c3) のマニュアルを PLaMo 翻訳で機械翻訳したものです。誤訳を含むことがあります。原文: https://www.gnu.org/software/emacs/manual/html_node/elisp/Inheritance-and-Keymaps.html ・ emacs-doc.conao3.com

23.5 継承とキーマップ

キーマップは、別のキーマップ(これを親キーマップと呼びます)のバインディングを継承できます。このようなキーマップは次のようになります。

(keymap elements... . parent-keymap)

これにより、このキーマップは、キー参照時にどのような割り当てがなされていようとも parent-keymap のすべてのバインドを継承し、さらに elements を用いてそれらに追記したり上書きしたりできるようになります。

keymap-set やその他のキーバインド関数を用いて parent-keymap のバインドを変更すると、elements によるバインドで上書きされない限り、変更されたバインドは継承先のキーマップに反映されます。その逆は成り立ちません。つまり、keymap-set を用いて継承先のキーマップのバインドを変更しても、その変更は elements には記録されますが、parent-keymap には影響しません。

親を持つキーマップを構築する正しい方法は set-keymap-parent を使用することです。親を持つキーマップを直接構築しているコードがある場合は、代わりに set-keymap-parent を使用するようにプログラムを変換してください。

関数: keymap-parent keymap

これは keymap の親キーマップを返します。keymap に親がない場合は、keymap-parent は nil を返します。

関数: set-keymap-parent keymap parent

これにより、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 関数を使用できます。

関数: make-composed-keymap maps &optional parent

この関数は、既存のキーマップ(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)
  ...)