Цикл команд считывает последовательность клавиш за раз, вызывая
read-key-sequence. Программы на Lisp также могут вызывать эту функцию;
например, describe-key использует ее для считывания клавиши для описания.
Эта функция считывает последовательность клавиш и возвращает ее в виде строки или вектора. Она продолжает считывать события до тех пор, пока не соберет полную последовательность клавиш; то есть достаточно, чтобы указать команду, не являющуюся префиксом, используя текущие карты клавиш. (Помните, что последовательность клавиш, начинающаяся с события мыши, считывается с использованием карт клавиш буфера в окне, в котором находилась мышь, а не текущего буфера.)
Если все события являются символами и все они могут поместиться в строку, то
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.
Аргумент disable-text-conversion, если он не равен nil,
означает, что системные методы ввода не будут напрямую выполнять редактирование
текста буфера во время считывания этой последовательности клавиш; ввод
пользователя всегда будет генерировать отдельные события клавиш. См. Различные системные события,
для получения дополнительной информации о преобразовании текста.
В следующем примере Emacs отображает подсказку «?» в области вывода, а затем пользователь вводит C-x C-f.
(read-key-sequence "?")
---------- Область вывода ----------
?C-x C-f
---------- Область вывода ----------
⇒ "^X^F"
Функция read-key-sequence подавляет выход: C-g
, введенная во время считывания с помощью этой функции, работает как любая другая
клавиша и не устанавливает quit-flag. См. Выход.
Это похоже на read-key-sequence, за исключением того, что она
всегда возвращает последовательность клавиш в виде вектора, а не строки.
См. Помещение событий клавиатуры в строки.
Если вводный символ является заглавной буквой (или имеет модификатор Shift) и
не имеет привязки клавиш, но его эквивалент в нижнем регистре имеет привязку,
то read-key-sequence преобразует символ в нижний регистр. (Это
поведение можно отключить, установив опцию пользователя
translate-upper-case-key-bindings в nil.)
Обратите внимание, что lookup-key не выполняет преобразование регистра
этим способом.
При считывании ввода, приводящем к такой переводу с помощью Shift,
Emacs устанавливает переменную this-command-keys-shift-translated
в значение, не равное nil. Программы на Lisp могут проверять эту
переменную, если им необходимо изменить свое поведение при вызове с помощью
переведенных с помощью Shift клавиш. Например, функция handle-shift-selection
проверяет значение этой переменной, чтобы определить, как активировать или деактивировать
область (см. handle-shift-selection).
Функция read-key-sequence также преобразует некоторые события мыши.
Она преобразует необязательные события перетаскивания в события клика и полностью
отбрасывает необязательные события нажатия кнопки. Она также переупорядочивает события
фокуса и различные события окна, чтобы они никогда не появлялись в последовательности
клавиш вместе с другими событиями.
Когда события мыши или touchscreen-begin и touchscreen-end
происходят в специальных частях окна или фрейма, таких как строка режима или полоса
прокрутки, тип события не показывает ничего особенного — это тот же символ, который
обычно представляет данное сочетание кнопки мыши и модификаторов. Информация о части
окна хранится в другом месте в событии — в координатах. Но
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 "Нажмите на строку режима: ")
⇒ [mode-line
(mouse-1
(#<window 6 on NEWS> mode-line
(40 . 63) 5959987))]
Значение этой переменной — это количество обработанных последовательностей клавиш в этой сессии Emacs. Это включает последовательности клавиш, считанные из терминала, и последовательности клавиш, считанные из выполняемых макросов клавиатуры.