Spec-Zone.ru › Elisp

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

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

(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

Назначает parent родительской картой клавиш для keymap и возвращает 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)
  ...)

Copyright © 1990-1996, 1998-2026 Free Software Foundation, Inc.
Licensed under the GNU GPL license.
https://www.gnu.org/software/emacs/manual/html_node/elisp/Inheritance-and-Keymaps.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API