22.8.1 Ввод последовательности клавиш

Цикл команд считывает последовательность клавиш за раз, вызывая read-key-sequence. Программы на Lisp также могут вызывать эту функцию; например, describe-key использует ее для считывания клавиши для описания.

Функция: read-key-sequence prompt &optional continue-echo dont-downcase-last switch-frame-ok command-loop disable-text-conversion

Эта функция считывает последовательность клавиш и возвращает ее в виде строки или вектора. Она продолжает считывать события до тех пор, пока не соберет полную последовательность клавиш; то есть достаточно, чтобы указать команду, не являющуюся префиксом, используя текущие карты клавиш. (Помните, что последовательность клавиш, начинающаяся с события мыши, считывается с использованием карт клавиш буфера в окне, в котором находилась мышь, а не текущего буфера.)

Если все события являются символами и все они могут поместиться в строку, то 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-vector prompt &optional continue-echo dont-downcase-last switch-frame-ok command-loop disable-text-conversion

Это похоже на 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))]
Переменная: num-input-keys

Значение этой переменной — это количество обработанных последовательностей клавиш в этой сессии Emacs. Это включает последовательности клавиш, считанные из терминала, и последовательности клавиш, считанные из выполняемых макросов клавиатуры.