22.8.3 Изменение и трансляция событий ввода

Emacs изменяет каждое прочитанное им событие в соответствии с extra-keyboard-modifiers, затем транслирует его через keyboard-translate-table (если применимо), прежде чем вернуть его из read-event.

Переменная: extra-keyboard-modifiers

Эта переменная позволяет программам Lisp «нажимать» модификаторы клавиш на клавиатуре. Значение представляет собой символ. Важны только модификаторы символа. Каждый раз, когда пользователь нажимает клавишу на клавиатуре, она изменяется так, как если бы эти модификаторы клавиш были нажаты. Например, если вы привяжете extra-keyboard-modifiers к ?\C-\M-a, то все символы ввода с клавиатуры, набранные в области действия привязки, будут иметь примененные модификаторы Control и Meta. Символ ?\C-@, эквивалентный целому числу 0, не считается управляющим символом для этой цели, а считается символом без модификаторов. Таким образом, установка extra-keyboard-modifiers в ноль отменяет любое изменение.

При использовании оконной системы программа может нажимать любые модификаторы клавиш таким образом. В противном случае виртуально могут быть нажаты только клавиши CTL и META.

Обратите внимание, что эта переменная применяется только к событиям, которые действительно поступают с клавиатуры, и не влияет на события мыши или любые другие события.

Переменная: keyboard-translate-table

Эта терминальная переменная является таблицей трансляции для символов клавиатуры. Она позволяет переупорядочить клавиши на клавиатуре, не изменяя привязки команд. Ее значение обычно представляет собой char-table или nil. (Она также может быть строкой или вектором, но это считается устаревшим.)

Если keyboard-translate-table является char-table (см. Char-Tables), то каждый символ, прочитанный с клавиатуры, ищется в этой char-table. Если найденное там значение не равно nil, то оно используется вместо фактического вводимого символа.

Обратите внимание, что эта трансляция — первое, что происходит с символом после его чтения из терминала. Функции ведения журнала, такие как recent-keys и dribble-файлы, записывают символы после трансляции.

Также обратите внимание, что эта трансляция выполняется до того, как символы будут переданы методам ввода (см. Методы ввода). Используйте translation-table-for-input (см. Трансляция символов), если вы хотите транслировать символы после работы методов ввода.

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

Эта функция изменяет keyboard-translate-table, чтобы транслировать код символа from в код символа to. Она создает таблицу трансляции клавиатуры, если это необходимо. Оба from и to должны быть строками, удовлетворяющими key-valid-p (см. Последовательности клавиш). Если to равно nil, функция удаляет любую существующую трансляцию для from.

Вот пример использования keyboard-translate-table для того, чтобы C-x, C-c и C-v выполняли операции вырезания, копирования и вставки:

(key-translate "C-x" "")
(key-translate "C-c" "")
(key-translate "C-v" "")
(keymap-global-set "" 'kill-region)
(keymap-global-set "" 'kill-ring-save)
(keymap-global-set "" 'yank)

На графическом терминале, поддерживающем расширенный ввод ASCII, вы все еще можете получить стандартные значения Emacs для одного из этих символов, нажимая его с клавишей Shift. Это делает его другим символом с точки зрения трансляции клавиатуры, но он имеет то же обычное значение.

См. Карты клавиш для трансляции последовательностей событий, для механизмов, которые транслируют последовательности событий на уровне read-key-sequence. Если вам необходимо транслировать события ввода, которые не являются символами (т.е. characterp возвращает nil для них), вы должны использовать механизм трансляции событий, описанный там.