Изменение и преобразование событий ввода
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
-
Эта переменная, локальная для терминала, представляет собой таблицу преобразования символов клавиатуры. Она позволяет менять местами клавиши на клавиатуре, не изменяя привязки команд. Обычно её значение — это таблица символов или
nil. (Также это может быть строка или вектор, но такой способ считается устаревшим.)Если
keyboard-translate-table— таблица символов (см. Таблицы символов), то каждый символ, считываемый с клавиатуры, ищется в этой таблице. Если найденное значение не равноnil, оно используется вместо фактически введённого символа.Обратите внимание, что это преобразование — первое действие над символом после его считывания с терминала. Средства ведения записей, такие как
recent-keys, и файлы протоколирования записывают символы после преобразования.Также обратите внимание, что это преобразование выполняется до передачи символов методам ввода (см. Методы ввода). Если требуется преобразовывать символы после обработки методами ввода, используйте
translation-table-for-input(см. Преобразование символов).
- Команда: key-translate from to
Эта команда изменяет
keyboard-translate-table, чтобы преобразовывать код символа from в код символа to. В интерактивном режиме она запрашивает значения from и to. При необходимости команда создаёт таблицу преобразования клавиатуры. И from, и to должны быть строками, удовлетворяющимиkey-valid-p(см. Последовательности клавиш). Если to равноnil, функция удаляет существующее преобразование для from.
Вот пример использования keyboard-translate-table для назначения клавишам C-x, C-c и C-v операций вырезания, копирования и вставки:
(key-translate "C-x" "<control-x>") (key-translate "C-c" "<control-c>") (key-translate "C-v" "<control-v>") (keymap-global-set "<control-x>" 'kill-region) (keymap-global-set "<control-c>" 'kill-ring-save) (keymap-global-set "<control-v>" 'yank)
На графическом терминале, поддерживающем расширенный ввод ASCII, стандартное значение одного из этих символов в Emacs по-прежнему можно получить, нажав его вместе с клавишей Shift. Для преобразования клавиатуры это будет другой символ, но его обычное значение останется прежним.
О механизмах преобразования последовательностей событий на уровне read-key-sequence см. раздел Клавиатурные карты для преобразования последовательностей событий. Если требуется преобразовывать события ввода, не являющиеся символами (то есть для них characterp возвращает nil), необходимо использовать описанный там механизм преобразования событий.
- Команда: key-translate-remove from
Эта команда запрашивает клавишу from и её преобразование, а затем удаляет преобразование из таблицы преобразований. При вызове из Lisp укажите только клавишу from, без её преобразования.
Copyright © 1990-1996, 1998-2026 Free Software Foundation, Inc.
Licensed under the GNU GPL license.
https://www.gnu.org/software/emacs/manual/html_node/elisp/Event-Mod.html