Ввод последовательности клавиш
Цикл команд считывает входные данные по последовательности клавиш за раз, вызывая read-key-sequence. Программы Lisp также могут вызывать эту функцию; например, describe-key использует её для чтения клавиш для описания.
- Функция: read-key-sequence prompt &optional continue-echo dont-downcase-last switch-frame-ok command-loop
-
Эта функция считывает последовательность клавиш и возвращает её в виде строки или вектора. Она продолжает считывать события до тех пор, пока не накопит полную последовательность клавиш; то есть, достаточно для указания команды, не являющейся префиксом, используя текущие активные раскладки клавиш. (Помните, что последовательность клавиш, начинающаяся с события мыши, считывается с помощью раскладок клавиш буфера в окне, в котором находилась мышь, а не текущего буфера.)
Если все события являются символами и все они помещаются в строку, то
read-key-sequenceвозвращает строку (см. Строки событий). В противном случае она возвращает вектор, так как вектор может содержать все типы событий — символы, списки и т.п. Элементами строки или вектора являются события в последовательности клавиш.Чтение последовательности клавиш включает в себя преобразование событий различными способами. См. Раскладки клавиш преобразования.
Аргумент prompt — это либо строка, отображаемая в области эха в качестве приглашения, либо
nil, что означает, что приглашение не должно отображаться. Аргумент continue-echo, если неnil, означает, что эту клавишу следует отобразить как продолжение предыдущей клавиши.Обычно любая заглавная буква преобразуется в строчную, если исходное событие не определено, а строчная эквивалент определён. Аргумент dont-downcase-last, если не
nil, означает, что последнее событие не должно преобразовываться в строчные буквы. Это подходит для чтения последовательности клавиш, которая должна быть определена.Аргумент switch-frame-ok, если не
nil, означает, что эта функция должна обработать событиеswitch-frameесли пользователь переключается на другие фреймы, прежде чем набрать что-либо. Если пользователь переключается на другие фреймы во время набора последовательности клавиш или в начале последовательности, но switch-frame-ok равноnil, то событие будет отложено до окончания текущей последовательности клавиш.Аргумент command-loop, если не
nil, означает, что эта последовательность клавиш считывается чем-то, что будет считывать команды одну за другой. Она должна бытьnil, если вызывающий объект прочитает только одну последовательность клавиш.В следующем примере Emacs отображает в области эха приглашение ‘?’, а затем пользователь набирает C-x C-f.
(read-key-sequence "?")
---------- Echo Area ---------- ?C-x C-f ---------- Echo Area ---------- ⇒ "^X^F"Функция
read-key-sequenceподавляет выход: C-g, набранная во время чтения с помощью этой функции, работает как любой другой символ и не устанавливаетquit-flag. См. Выход.
- Функция: read-key-sequence-vector prompt &optional continue-echo dont-downcase-last switch-frame-ok command-loop
Это похоже на
read-key-sequenceза исключением того, что она всегда возвращает последовательность клавиш как вектор, никогда как строку. См. Строки событий.
Если символ ввода — заглавный (или имеет модификатор сдвига) и не имеет привязки клавиш, но его строчный эквивалент имеет, то read-key-sequence преобразует символ в строчные буквы. Обратите внимание, что lookup-key не выполняет преобразования регистра таким образом.
При чтении входных данных, приводящем к такому преобразованию сдвига, Emacs устанавливает переменную this-command-keys-shift-translated в значение, отличное от nil. Программы Lisp могут проверить эту переменную, если им нужно изменить своё поведение при вызове клавиш с преобразованием регистра. Например, функция handle-shift-selection проверяет значение этой переменной, чтобы определить, как активировать или деактивировать область (см. обработка-выбора-с-регистром).
Функция read-key-sequence также преобразует некоторые события мыши. Она преобразует неопределённые события перетаскивания в события щелчка и полностью игнорирует неопределённые события нажатия кнопок. Она также перегруппировывает события фокуса и различные события окон, чтобы они никогда не появлялись в последовательности клавиш вместе с другими событиями.
Когда события мыши происходят в особых частях окна или фрейма, таких как строка режима или полоса прокрутки, тип события ничего не показывает — это тот же символ, что обычно представляет собой комбинацию кнопки мыши и клавиш-модификаторов. Информация о части окна сохраняется в другом месте в событии — в координатах. Но read-key-sequence преобразует эту информацию в воображаемые клавиши-префиксы, все из которых являются символами: tab-line, header-line, horizontal-scroll-bar, menu-bar, tab-bar, mode-line, vertical-line, vertical-scroll-bar, left-margin, right-margin, left-fringe, right-fringe, right-divider, и bottom-divider. Вы можете определить значения для щелчков мышью в особых частях окна, определив последовательности клавиш, используя эти воображаемые клавиши-префиксы.
Например, если вы вызовете read-key-sequence и затем щелкните мышью по строке режима окна, вы получите два события, подобно этому:
(read-key-sequence "Click on the mode line: ")
⇒ [mode-line
(mouse-1
(#<window 6 on NEWS> mode-line
(40 . 63) 5959987))]
- Переменная: num-input-keys
Значение этой переменной — количество последовательностей клавиш, обработанных до сих пор в этой сессии Emacs. Включает в себя последовательности клавиш, считанные с терминала, и последовательности клавиш, считанные из выполняемых макросов клавиатуры.
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/Key-Sequence-Input.html