Каждое отображение клавиш — это список, чей CAR — это символ keymap. Остальные элементы списка определяют привязки клавиш этого отображения. Символ, функция которого определена как отображение клавиш, также является отображением клавиш. Используйте функцию keymapp (см. ниже), чтобы проверить, является ли объект отображением клавиш.
В отображении клавиш после символа keymap могут встречаться несколько типов элементов:
(type . binding)Это указывает одну привязку для событий типа type. Каждая обычная привязка применяется к событиям определенного типа события, который всегда является символом или символом. См. Классификация событий. В этом типе привязки binding — это команда.
(type item-name . binding)Это указывает привязку, которая также является простым элементом меню, отображаемым как item-name в меню. См. Простые элементы меню.
(type item-name help-string . binding)Это простой элемент меню с строкой справки help-string.
(type menu-item . details)Это указывает привязку, которая также является расширенным элементом меню. Это позволяет использовать другие функции. См. Расширенные элементы меню.
(t . binding) ¶Это указывает привязку по умолчанию; любое событие, не привязанное другими элементами отображения клавиш, получает binding в качестве своей привязки. Привязки по умолчанию позволяют отображению клавиш привязывать все возможные типы событий, не перечисляя их все. Отображение клавиш, имеющее привязку по умолчанию, полностью маскирует любое отображение клавиш с более низким приоритетом, за исключением событий, явно привязанных к nil (см. ниже).
char-tableЕсли элемент отображения клавиш является таблицей символов, он считается содержащим привязки для всех символьных событий без битов модификатора (см. биты модификатора): элемент, индекс которого равен c, является привязкой для символа c. Это компактный способ записи множества привязок. Отображение клавиш с такой таблицей символов называется полным отображением клавиш. Другие отображения клавиш называются разреженными отображениями клавиш.
vectorЭтот тип элемента похож на таблицу символов: элемент, индекс которого равен c, является привязкой для символа c. Поскольку диапазон символов, которые могут быть привязаны таким образом, ограничен размером вектора, а создание вектора выделяет место для всех кодов символов от 0 и выше, этот формат следует использовать только для создания отображений клавиш меню (см. Отображения клавиш меню), где сами привязки не имеют значения.
string ¶Помимо элементов, определяющих привязки для клавиш, отображение клавиш может иметь строку в качестве элемента. Это называется общей строкой подсказки и позволяет использовать отображение клавиш в качестве меню. См. Определение меню.
(keymap …)Если элемент отображения клавиш сам является отображением клавиш, он считается вставленным во внешнее отображение клавиш. Это используется для множественного наследования, например, в make-composed-keymap.
Когда привязка равна nil, она не составляет определение, но имеет приоритет над привязкой по умолчанию или привязкой в родительском отображении клавиш. С другой стороны, привязка nil не переопределяет отображения клавиш с более низким приоритетом; таким образом, если локальное отображение дает привязку nil, Emacs использует привязку из глобального отображения.
Отображения клавиш не записывают напрямую привязки для метасимволов. Вместо этого метасимволы рассматриваются для целей поиска клавиш как последовательности из двух символов, первый из которых — ESC (или то, что в настоящее время установлено в meta-prefix-char). Таким образом, клавиша M-a внутренне представляется как ESC a, и ее глобальная привязка находится в слоте для a в esc-map (см. Префиксные клавиши).
Это преобразование применяется только к символам, а не к функциональным клавишам или другим входным событиям; таким образом, M-end не имеет отношения к ESC end.
Вот пример локального отображения клавиш для режима Lisp, разреженного отображения клавиш. Оно определяет привязки для DEL, C-c C-z, C-M-q и C-M-x (фактическое значение также содержит привязку меню, которая здесь опущена для краткости).
lisp-mode-map ⇒
(keymap
(3 keymap
;; C-c C-z
(26 . run-lisp))
(27 keymap
;; C-M-x, рассматривается как ESC C-x
(24 . lisp-send-defun))
;; Эта часть наследуется из lisp-mode-shared-map.
keymap
;; DEL
(127 . backward-delete-char-untabify)
(27 keymap
;; C-M-q, рассматривается как ESC C-q
(17 . indent-sexp)))
Эта функция возвращает t, если object является отображением клавиш, nil в противном случае. Точнее, эта функция проверяет, является ли список, чей CAR равен keymap, или является ли символ, функция которого удовлетворяет keymapp.
(keymapp '(keymap))
⇒ t
(fset 'foo '(keymap))
(keymapp 'foo)
⇒ t
(keymapp (current-global-map))
⇒ t