Схема расположения клавиш для перевода последовательностей событий
Когда функция read-key-sequence считывает последовательность нажатий клавиш (см. Ввод последовательностей нажатий клавиш), она использует карты перевода для перевода определенных последовательностей событий в другие. Карты перевода — это input-decode-map, local-function-key-map, и key-translation-map (в порядке приоритета).
Карты перевода имеют ту же структуру, что и другие карты клавиш, но используются по-другому: они задают переводы при чтении последовательностей нажатий клавиш, а не привязки для полных последовательностей нажатий клавиш. При чтении каждой последовательности нажатий клавиш она проверяется по каждой карте перевода. Если одна из карт перевода привязывает k к вектору v, то всякий раз, когда k появляется как подпоследовательность в любом месте в последовательности нажатий клавиш, эта подпоследовательность заменяется событиями в v.
Например, терминалы VT100 отправляют ESC O P при нажатии клавиши PF1 на клавиатуре. В таких терминалах Emacs должен перевести эту последовательность событий в одно событие pf1. Это делается путем привязки ESC O P к [pf1] в input-decode-map. Таким образом, при наборе C-c PF1 на терминале, терминал генерирует последовательность символов C-c ESC O P, и read-key-sequence преобразует это обратно в C-c PF1 и возвращает его как вектор [?\C-c pf1].
Карты перевода вступают в силу только после того, как Emacs декодировал входные данные клавиатуры (через систему кодирования ввода, указанную в keyboard-coding-system). См. Кодирование терминала ввода/вывода.
- Переменная: input-decode-map
-
Эта переменная содержит карту клавиш, которая описывает последовательности символов, отправляемые функциональными клавишами на обычном символьном терминале.
Значение
input-decode-mapобычно устанавливается автоматически в соответствии с записью терминала Terminfo или Termcap, но иногда этим записям требуется помощь из файлов Lisp, специфичных для терминала. Emacs поставляется с файлами, специфичными для терминала, для многих распространенных терминалов; их основная цель — внести записи вinput-decode-mapза пределами тех, которые можно вывести из Termcap и Terminfo. См. Уникальные для терминала.
- Переменная: local-function-key-map
-
Эта переменная содержит карту клавиш, аналогичную
input-decode-map, за исключением того, что она описывает последовательности нажатий клавиш, которые должны быть переведены в альтернативные интерпретации, которые обычно предпочтительнее. Она применяется послеinput-decode-mapи передkey-translation-map.Записи в
local-function-key-mapигнорируются, если они конфликтуют с привязками, сделанными в локальных или глобальных картах клавиш. То есть, переназначение применяется только в том случае, если исходная последовательность нажатий клавиш в противном случае не имела бы никакой привязки.local-function-key-mapнаследует отfunction-key-map. Последний следует изменять только в том случае, если вы хотите, чтобы привязка применялась ко всем терминалам, поэтому использование первого почти всегда предпочтительнее.
- Переменная: key-translation-map
-
Эта переменная — еще одна карта клавиш, используемая так же, как
input-decode-mapдля перевода событий ввода в другие события. Она отличается отinput-decode-mapтем, что начинает работать после того, как завершаетсяlocal-function-key-map, а не перед ним; она получает результаты перевода отlocal-function-key-map.Как и
input-decode-map, но в отличие отlocal-function-key-map, эта карта клавиш применяется независимо от того, есть ли у последовательности нажатий клавиш обычная привязка. Обратите внимание, однако, что фактические привязки клавиш могут повлиять наkey-translation-map, даже если они переопределяются ей. Фактически, фактические привязки клавиш переопределяютlocal-function-key-mapи, следовательно, могут изменить последовательность нажатий клавиш, которуюkey-translation-mapполучает. Очевидно, лучше избегать таких ситуаций.Цель
key-translation-mapсостоит в том, чтобы пользователи могли сопоставлять один набор символов с другим, включая обычные символы, обычно привязанные кself-insert-command.
Вы можете использовать input-decode-map, local-function-key-map, и key-translation-map для большего, чем просто алиасы, используя функцию, а не последовательность нажатий клавиш, в качестве перевода клавиши. Затем эта функция вызывается для вычисления перевода этой клавиши.
Функция перевода клавиш получает один аргумент, который является приглашением, указанным в read-key-sequence — или nil, если последовательность нажатий клавиш считывается циклом команд редактора. В большинстве случаев вы можете игнорировать значение приглашения.
Если функция считывает входные данные сама, она может повлиять на последующее событие. Например, вот как определить C-c h для преобразования следующего символа в символ Hyper:
(defun hyperify (prompt)
(let ((e (read-event)))
(vector (if (numberp e)
(logior (ash 1 24) e)
(if (memq 'hyper (event-modifiers e))
e
(add-event-modifier "H-" e))))))
(defun add-event-modifier (string e)
(let ((symbol (if (symbolp e) e (car e))))
(setq symbol (intern (concat string
(symbol-name symbol))))
(if (symbolp e)
symbol
(cons symbol (cdr e)))))
(define-key local-function-key-map "\C-ch" 'hyperify)
Взаимодействие с обычными картами клавиш
Конец последовательности нажатий клавиш обнаруживается, когда эта последовательность либо привязана к команде, либо когда Emacs определяет, что дополнительное событие не может привести к последовательности, которая привязана к команде.
Это означает, что, хотя input-decode-map и key-translation-map применяются независимо от того, будет ли исходная последовательность нажатий клавиш иметь привязку, наличие такой привязки все равно может предотвратить перевод. Например, вернемся к нашему примеру VT100 выше и добавим привязку для C-c ESC к глобальной карте; теперь, когда пользователь нажимает C-c PF1, Emacs не сможет декодировать C-c ESC O P в C-c PF1, потому что он прекратит чтение клавиш сразу после C-c ESC, оставив O P на потом. Это в случае, если пользователь действительно нажал C-c ESC, в этом случае Emacs не должен ждать следующей клавиши, чтобы решить, действительно ли пользователь нажал ESC или PF1.
По этой причине лучше избегать привязки команд к последовательностям нажатий клавиш, где конец последовательности является префиксом перевода клавиш. Основные такие проблемные суффиксы/префиксы — ESC, M-O (что фактически ESC O) и M-[ (что фактически ESC [).
Copyright © 1990-1996, 1998-2022 Free Software Foundation, Inc.
Licensed under the GNU GPL license.
https://www.gnu.org/software/emacs/manual/html_node/elisp/Translation-Keymaps.html