23.6 Префиксные клавиши

Префиксная клавиша — это последовательность клавиш, привязка которой представляет собой карту клавиш. Эта карта клавиш определяет, что делать с последовательностями клавиш, расширяющими префиксную клавишу. Например, C-x — это префиксная клавиша, и она использует карту клавиш, которая также хранится в переменной ctl-x-map. Эта карта клавиш определяет привязки для последовательностей клавиш, начинающихся с C-x.

Некоторые стандартные префиксные клавиши Emacs используют карты клавиш, которые также находятся в переменных Lisp:

Привязка карты клавиш префиксной клавиши используется для поиска события, следующего за префиксной клавишей. (Вместо этого это может быть символ, функция которого является картой клавиш. Эффект тот же, но символ служит именем для префиксной клавиши.) Таким образом, привязка 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
Функция: define-prefix-command symbol &optional mapvar prompt

Эта функция готовит symbol для использования в качестве привязки префиксной клавиши: она создает разреженную карту клавиш и сохраняет ее как функцию symbol. Впоследствии привязка последовательности клавиш к symbol превратит эту последовательность клавиш в префиксную клавишу. Возвращаемое значение — symbol.

Эта функция также устанавливает symbol как переменную, значение которой — карта клавиш. Но если mapvar не равно nil, она устанавливает mapvar как переменную вместо этого.

Если prompt не равно nil, это становится общим строковым приглашением для карты клавиш. Строка приглашения должна быть предоставлена для меню-карт клавиш (см. Определение меню).