23.5 Наследование и карты клавиш

Карта клавиш может наследовать привязки другой карты клавиш, которую мы называем родительской картой клавиш. Такая карта клавиш выглядит так:

(keymap elements… . parent-keymap)

Эффект заключается в том, что эта карта клавиш наследует все привязки parent-keymap, какие бы они ни были на момент поиска клавиши, но может добавлять к ним или переопределять их с помощью elements.

Если вы изменяете привязки в parent-keymap с помощью keymap-set или других функций привязки клавиш, эти измененные привязки видны в наследуемой карте клавиш, если только они не затенены привязками, сделанными 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

Эта функция возвращает новую карту клавиш, составленную из существующих карт клавиш maps и, при необходимости, наследующую от родительской карты клавиш parent. maps может быть одной картой клавиш или списком из более чем одной. При поиске клавиши в результирующей новой карте Emacs проверяет каждую из maps по очереди, а затем parent, останавливаясь при первом совпадении. Привязка nil в любой из maps переопределяет любую привязку в parent, но не переопределяет ни одну не-nil привязку в любой другой из maps.

Например, вот как 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)
  ...)