Spec-Zone.ru › Elisp

Схема расположения клавиш для перевода последовательностей событий

Когда функция 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API