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

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

Если все события являются символами и все они помещаются в строку, то 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

Spec-Zone.ru

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