23.13 Низкоуровневая привязка клавиш

Исторически Emacs поддерживал несколько различных синтаксисов для определения клавиш. Документированный способ привязки клавиш на сегодняшний день — это использование синтаксиса, поддерживаемого key-valid-p, который используется всеми функциями, такими как keymap-set и keymap-lookup. В этом разделе документируются устаревшие синтаксис и интерфейсные функции; их не следует использовать в новом коде.

define-key (и другие низкоуровневые функции, используемые для переназначения клавиш) понимают несколько различных синтаксисов для клавиш.

Вектор, содержащий списки клавиш.

Можно использовать список, содержащий имена модификаторов плюс одно базовое событие (символ или имя клавиши-функции). Например, [(control ?a) (meta b)] эквивалентно C-a M-b, а [(hyper control left)] эквивалентно C-H-left.

Строка символов с модификаторами

Внутренне последовательности клавиш часто представляются в виде строк с использованием специальных escape-последовательностей для модификаторов shift, control и meta (см. Тип строка), но это представление также может использоваться пользователями при переназначении клавиш. Строка вида "\M-x" читается как содержащая одну клавишу M-x, "\C-f" читается как содержащая одну клавишу C-f, а "\M-\C-x" и "\C-\M-x" обе читаются как содержащие одну клавишу C-M-x.

Вектор символов и символьных обозначений клавиш

Это другое внутреннее представление последовательностей клавиш. Оно поддерживает более полный набор модификаторов, чем строковое представление, а также поддерживает клавиши-функции. Пример: ‘[?\C-\H-x home]’, который представляет последовательность клавиш C-H-x home. См. Тип символ.

Функция: define-key keymap key binding &optional remove

Эта функция подобна keymap-set (см. Изменение привязок клавиш), но понимает только устаревшие синтаксисы клавиш.

Кроме того, эта функция также имеет аргумент remove. Если он не равен nil, определение будет удалено. Это почти то же самое, что и установка определения в nil, но имеет значение, если keymap имеет родителя, и key затеняет ту же привязку в родителе. С remove последующие поиски будут возвращать привязку из родителя, тогда как с определением nil поиски будут возвращать nil.

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

Команда: global-set-key key binding

Эта функция устанавливает привязку key в текущей глобальной карте в binding. Вместо неё используйте keymap-global-set.

Команда: global-unset-key key

Эта функция удаляет привязку key из текущей глобальной карты. Вместо неё используйте keymap-global-unset.

Команда: local-set-key key binding

Эта функция устанавливает привязку key в текущей локальной карте в binding. Вместо неё используйте keymap-local-set.

Команда: local-unset-key key

Эта функция удаляет привязку key из текущей локальной карты. Вместо неё используйте keymap-local-unset.

Функция: substitute-key-definition olddef newdef keymap &optional oldmap

Эта функция заменяет olddef на newdef для любых клавиш в keymap, которые были привязаны к olddef. Другими словами, olddef заменяется на newdef везде, где он встречается. Функция возвращает nil. Вместо неё используйте keymap-substitute.

Функция: define-key-after map key binding &optional after

Определяет привязку в map для key со значением binding, так же как define-key, но размещает привязку в map после привязки для события after. Аргумент key должен быть длины один — вектор или строка с одним элементом. Но after должен быть одиночным типом события — символом или символом, а не последовательностью. Новая привязка помещается после привязки для after. Если after равен t или опущен, то новая привязка помещается последней, в конец карты. Однако новые привязки добавляются перед любой унаследованной картой. Вместо этой функции используйте keymap-set-after.

Функция: keyboard-translate from to

Эта функция изменяет keyboard-translate-table, чтобы транслировать код символа from в код символа to. Она создаёт таблицу трансляции клавиатуры при необходимости. Вместо неё используйте key-translate.

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

Эта функция возвращает привязку для key согласно текущим активным картам. Результат — nil, если key не определена в картах. Аргумент accept-defaults управляет проверкой привязок по умолчанию, как в lookup-key (см. Функции для поиска клавиш). Если no-remap не равен nil, key-binding игнорирует переопределения команд (см. Переопределение команд) и возвращает привязку, непосредственно заданную для key. Необязательный аргумент position должен быть либо позицией в буфере, либо позицией события, например значением event-start; он указывает функции использовать карты, определяемые на основе этой position.

Emacs сигнализирует об ошибке, если key не является строкой или вектором.

Вместо этой функции используйте keymap-lookup.

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

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

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

Вместо этой функции используйте keymap-lookup.

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

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

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

Вместо этой функции используйте keymap-local-lookup.

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

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

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

Вместо этой функции используйте keymap-global-lookup.

Функция: event-convert-list list

Эта функция преобразует список имён модификаторов и базовый тип события в тип события, который задаёт их все. Базовый тип события должен быть последним элементом списка. Например,

(event-convert-list '(control ?a))
     ⇒ 1
(event-convert-list '(control meta ?a))
     ⇒ -134217727
(event-convert-list '(control super f1))
     ⇒ C-s-f1