Spec-Zone.ru › Elisp

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

Цикл команд считывает ввод по одной последовательности клавиш, вызывая 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 "?")

---------- 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 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 "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-2026 Free Software Foundation, Inc.
Licensed under the GNU GPL license.
https://www.gnu.org/software/emacs/manual/html_node/elisp/Key-Sequence-Input.html

Spec-Zone.ru

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