23.11 Функции для поиска по клавишам

Ниже приведены функции и переменные, относящиеся к поиску по клавишам.

Функция: keymap-lookup keymap key &optional accept-defaults no-remap position

Эта функция возвращает определение key в keymap. Все другие функции, описанные в этой главе, которые выполняют поиск по клавишам, используют keymap-lookup. Вот примеры:

(keymap-lookup (current-global-map) "C-x C-f")
    ⇒ find-file
(keymap-lookup (current-global-map) "C-x C-f 1 2 3 4 5")
    ⇒ 2

Если строка или вектор key не является допустимой последовательностью клавиш в соответствии с префиксными клавишами, указанными в keymap, то она слишком длинная и содержит дополнительные события в конце, которые не помещаются в одну последовательность клавиш. Тогда значением является число — количество событий в начале key, которые составляют полную клавишу.

Если accept-defaults не равно nil, то keymap-lookup рассматривает значения по умолчанию, а также привязки для конкретных событий в key. В противном случае keymap-lookup сообщает только о привязках для конкретной последовательности key, игнорируя значения по умолчанию, если вы явно не запрашиваете их. (Чтобы это сделать, передайте t как элемент key; см. Формат карт клавиш.)

Если key содержит мета-символ (не клавишу функции), этот символ неявно заменяется двухсимвольной последовательностью: значением meta-prefix-char, за которым следует соответствующий немета-символ. Таким образом, первый пример ниже обрабатывается путем преобразования во второй пример.

(keymap-lookup (current-global-map) "M-f")
    ⇒ forward-word
(keymap-lookup (current-global-map) "ESC f")
    ⇒ forward-word

Аргумент keymap может быть nil, что означает поиск key в текущих картах клавиш (возвращаемых current-active-maps, см. Активные карты клавиш); или он может быть картой клавиш или списком карт клавиш, что означает поиск key только в указанных картах клавиш.

В отличие от read-key-sequence, эта функция не изменяет указанные события таким образом, что теряется информация (см. Ввод последовательности клавиш). В частности, она не преобразует буквы в строчные и не преобразует события перетаскивания в клики.

Как и в обычном цикле команд, keymap-lookup может переназначить команду, полученную в результате поиска key, путем поиска этой команды в текущих картах клавиш. Однако, если необязательный третий аргумент no-remap не равен nil, keymap-lookup возвращает команду без переназначения.

Если необязательный аргумент position не равен nil, он указывает позицию мыши, возвращенную event-start и event-end, и поиск выполняется в картах клавиш, связанных с этой позицией, а не в keymap. position также может быть числом или маркером, в этом случае он интерпретируется как позиция буфера, и функция использует свойства карты клавиш в этой позиции, а не в точке.

Команда: undefined

Используется в картах клавиш для отмены определения клавиш. Она вызывает ding, но не вызывает ошибку.

Функция: keymap-local-lookup key &optional accept-defaults

Эта функция возвращает привязку для key в текущей локальной карте клавиш, или nil, если она не определена там.

Аргумент accept-defaults контролирует проверку значений по умолчанию, как и в keymap-lookup (выше).

Функция: keymap-global-lookup key &optional accept-defaults

Эта функция возвращает привязку команды key в текущей глобальной карте клавиш, или nil, если она не определена там.

Аргумент accept-defaults контролирует проверку значений по умолчанию, как и в keymap-lookup (выше).

Функция: minor-mode-key-binding key &optional accept-defaults

Эта функция возвращает список всех активных привязок режима, относящихся к key. Точнее, она возвращает alist пар (modename . binding), где modename — переменная, включающая режим, а binding — привязка key в этом режиме. Если у key нет привязок режима, возвращается nil.

Если первая найденная привязка не является определением префикса (картой клавиш или символом, определенным как карта клавиш), все последующие привязки из других режимов опускаются, поскольку они будут полностью затенены. Аналогично, список опускает непрефиксные привязки, следующие за префиксными.

Аргумент accept-defaults контролирует проверку значений по умолчанию, как и в keymap-lookup (выше).

Пользовательский вариант: meta-prefix-char

Эта переменная — код мета-префиксного символа. Она используется для преобразования мета-символа в двухсимвольную последовательность, чтобы его можно было найти в карте клавиш. Для получения полезных результатов значение должно быть префиксным событием (см. Префиксные клавиши). Значение по умолчанию равно 27, что является кодом ASCII для ESC.

Пока значение meta-prefix-char остается 27, поиск по клавишам преобразует M-b в ESC b, что обычно определяется как команда backward-word. Однако, если вы установите meta-prefix-char в 24, код C-x, то Emacs преобразует M-b в C-x b, стандартная привязка которой — команда switch-to-buffer. (Не делайте этого!) Вот иллюстрация того, что произойдет:

meta-prefix-char                    ; Значение по умолчанию.
     ⇒ 27
(key-binding "\M-b")
     ⇒ backward-word
?\C-x                               ; Представление для вывода
     ⇒ 24                          ;   символа.
(setq meta-prefix-char 24)
     ⇒ 24
(key-binding "\M-b")
     ⇒ switch-to-buffer            ; Теперь ввод M-b
                                    ;   подобен вводу C-x b.

(setq meta-prefix-char 27)          ; Избегайте путаницы!
     ⇒ 27                          ; Восстановите значение по умолчанию!

Это преобразование одного события в два происходит только для символов, а не для других типов событий ввода. Таким образом, M-F1, клавиша функции, не преобразуется в ESC F1.