Префиксная клавиша — это последовательность клавиш, привязка которой представляет собой карту клавиш. Эта карта клавиш определяет, что делать с последовательностями клавиш, расширяющими префиксную клавишу. Например, C-x — это префиксная клавиша, и она использует карту клавиш, которая также хранится в переменной ctl-x-map. Эта карта клавиш определяет привязки для последовательностей клавиш, начинающихся с C-x.
Некоторые стандартные префиксные клавиши Emacs используют карты клавиш, которые также находятся в переменных Lisp:
esc-map — это глобальная карта клавиш для префиксной клавиши ESC. Таким образом, глобальные определения всех метасимволов фактически находятся здесь. Эта карта также является функцией ESC-prefix.
help-map — это глобальная карта клавиш для префиксной клавиши C-h.
mode-specific-map — это глобальная карта клавиш для префиксной клавиши C-c. Эта карта фактически глобальна, а не специфична для режима, но ее имя предоставляет полезную информацию о C-c в выводе C-h b (display-bindings), поскольку основное использование этой префиксной клавиши — это привязки, специфичные для режима.
ctl-x-map — это глобальная карта клавиш, используемая для префиксной клавиши C-x. Эта карта находится через ячейку функции символа Control-X-prefix.
mule-keymap — это глобальная карта клавиш, используемая для префиксной клавиши C-x RET.
ctl-x-4-map — это глобальная карта клавиш, используемая для префиксной клавиши C-x 4.
ctl-x-5-map — это глобальная карта клавиш, используемая для префиксной клавиши C-x 5.
2C-mode-map — это глобальная карта клавиш, используемая для префиксной клавиши C-x 6.
tab-prefix-map — это глобальная карта клавиш, используемая для префиксной клавиши C-x t.
vc-prefix-map — это глобальная карта клавиш, используемая для префиксной клавиши C-x v.
goto-map — это глобальная карта клавиш, используемая для префиксной клавиши M-g.
search-map — это глобальная карта клавиш, используемая для префиксной клавиши M-s.
Привязка карты клавиш префиксной клавиши используется для поиска события, следующего за префиксной клавишей. (Вместо этого это может быть символ, функция которого является картой клавиш. Эффект тот же, но символ служит именем для префиксной клавиши.) Таким образом, привязка C-x — это символ Control-X-prefix, ячейка функции которого содержит карту клавиш для команд C-x. (Та же карта клавиш является также значением ctl-x-map.)
Определения префиксных клавиш могут появляться в любой активной карте клавиш. Определения C-c, C-x, C-h и ESC как префиксных клавиш появляются в глобальной карте, поэтому эти префиксные клавиши всегда доступны. Основные и второстепенные режимы могут переопределять клавишу как префикс, помещая определение префиксной клавиши для нее в локальную карту или карту второстепенного режима. См. Активные карты клавиш.
Если клавиша определена как префикс в более чем одной активной карте, то ее различные определения объединяются: команды, определенные в картах клавиш второстепенного режима, идут первыми, затем те, что в определении префиксной клавиши локальной карты, а затем те, что из глобальной карты.
В следующем примере мы делаем C-p префиксной клавишей в локальной карте клавиш таким образом, что C-p идентична C-x. Тогда привязка для C-p C-f — это функция find-file, точно так же, как и C-x C-f. В отличие от этого, последовательность клавиш C-p 9 не найдена ни в одной активной карте клавиш.
(use-local-map (make-sparse-keymap))
⇒ nil
(keymap-local-set "C-p" ctl-x-map)
⇒ (keymap #^[nil nil keymap …
(keymap-lookup nil "C-p C-f")
⇒ find-file
(keymap-lookup nil "C-p 9")
⇒ nil
Эта функция готовит symbol для использования в качестве привязки префиксной клавиши:
она создает разреженную карту клавиш и сохраняет ее как функцию symbol. Впоследствии привязка последовательности клавиш к symbol превратит эту последовательность клавиш в префиксную клавишу. Возвращаемое значение — symbol.
Эта функция также устанавливает symbol как переменную, значение которой — карта клавиш. Но если mapvar не равно nil, она устанавливает mapvar как переменную вместо этого.
Если prompt не равно nil, это становится общим строковым приглашением для карты клавиш. Строка приглашения должна быть предоставлена для меню-карт клавиш (см. Определение меню).