Наследование и ключевые карты
Ключевая карта может унаследовать привязки другой ключевой карты, которую мы называем родительской ключевой картой. Такая ключевая карта выглядит так:
(keymap elements… . parent-keymap)
В результате эта ключевая карта наследует все привязки родительской-ключевой-карты, какими бы они ни были в момент поиска ключа, но может добавлять к ним или переопределять их с помощью элементов.
Если вы измените привязки в родительской-ключевой-карте с помощью define-key или других функций привязки клавиш, эти изменённые привязки будут видны в наследующей ключевой карте, если не будут скрыты привязками, сделанными элементами. Обратное неверно: если вы используете define-key для изменения привязок в наследующей ключевой карте, эти изменения будут записаны в элементах, но не повлияют на родительскую-ключевую-карту.
Правильный способ создания ключевой карты с родителем — использовать set-keymap-parent; если у вас есть код, который напрямую создаёт ключевую карту с родителем, пожалуйста, преобразуйте программу, чтобы использовать set-keymap-parent вместо этого.
- Функция: keymap-parent ключевая-карта
Это возвращает родительскую ключевую карту ключевой-карты. Если у ключевой-карты нет родителя,
keymap-parentвозвращаетnil.
- Функция: set-keymap-parent ключевая-карта родитель
-
Это устанавливает родительскую ключевую карту ключевой-карты на родитель и возвращает родитель. Если родитель равен
nil, эта функция вообще не даёт ключевой-карте родителя.Если у ключевой-карты есть подкарты (привязки для префиксных клавиш), они также получат новые родительские ключевые карты, которые отражают то, что родитель определяет для этих префиксных клавиш.
Вот пример, показывающий, как создать ключевую карту, которая наследует от text-mode-map:
(let ((map (make-sparse-keymap))) (set-keymap-parent map text-mode-map) map)
Неразреженная ключевая карта также может иметь родителя, но это не очень полезно. Неразреженная ключевая карта всегда определяет что-то в качестве привязки для каждого числового кода символа без модификаторов, даже если это nil, поэтому привязки этих символов никогда не наследуются от родительской ключевой карты.
Иногда вам нужно создать ключевую карту, которая наследует от более чем одной карты. Для этого можно использовать функцию make-composed-keymap.
- Функция: make-composed-keymap карты &optional родитель
Эта функция возвращает новую ключевую карту, составленную из существующих ключевых карт карты, и необязательно наследующую от родительской ключевой карты родитель. карты может быть одной ключевой картой или списком более чем одной. При поиске ключа в полученной новой карте Emacs ищет в каждой из карт по очереди, а затем в родителе, останавливаясь на первой совпадении. Привязка
nilв любой из карт переопределяет любую привязку в родителе, но не переопределяет никакую не-nilпривязку в любой другой из карт.
Например, вот как Emacs устанавливает родителя help-mode-map, чтобы он наследовал от button-buffer-map и special-mode-map:
(defvar help-mode-map
(let ((map (make-sparse-keymap)))
(set-keymap-parent map
(make-composed-keymap button-buffer-map special-mode-map))
... map) ... )
Copyright © 1990-1996, 1998-2022 Free Software Foundation, Inc.
Licensed under the GNU GPL license.
https://www.gnu.org/software/emacs/manual/html_node/elisp/Inheritance-and-Keymaps.html