Дополнительные функции ввода событий
В этом разделе описывается, как предварительно просмотреть события, не используя их, как проверить наличие ожидаемого ввода и как отбросить ожидаемый ввод. См. также функцию read-passwd (см. Чтение пароля).
- Переменная: unread-command-events
-
Эта переменная хранит список событий, ожидающих обработки как командный ввод. События используются в порядке их появления в списке и удаляются по одному по мере использования.
Переменная необходима, потому что в некоторых случаях функция считывает событие, а затем решает его не использовать. Хранение события в этой переменной приводит к его нормальной обработке циклом команд или функциями чтения командного ввода.
Например, функция, реализующая числовые префиксные аргументы, считывает любое количество цифр. Когда она находит событие, которое не является цифрой, она должна отменить чтение этого события, чтобы оно могло быть прочитано циклом команд в обычном режиме. Аналогично, инкрементальный поиск использует эту функцию для отмены чтения событий без специального значения в поиске, потому что эти события должны завершить поиск и затем выполняться в обычном режиме.
Надежный и простой способ извлечения событий из последовательности нажатий клавиш для их помещения в
unread-command-events— использоватьlistify-key-sequence(см. ниже).Обычно вы добавляете события в начало этого списка, чтобы события, которые были последними отменены чтением, были первыми прочитаны повторно.
События, считанные из этого списка, обычно не добавляются в последовательность нажатий клавиш текущей команды (как возвращается, например,
this-command-keys), так как события уже были добавлены один раз при их первом чтении. Элемент вида(t . event)заставляет event быть добавленным в последовательность нажатий клавиш текущей команды.Элементы, считанные из этого списка, обычно регистрируются функциями ведения записей (см. Запись ввода) и при определении макроса клавиатуры (см. Макросы клавиатуры). Однако элемент вида
(no-record . event)заставляет event обрабатываться в обычном режиме без записи.
- Функция: listify-key-sequence key
Эта функция преобразует строку или вектор key в список отдельных событий, которые можно поместить в
unread-command-events.
- Функция: input-pending-p &optional check-timers
-
Эта функция определяет, есть ли в настоящее время доступный для чтения командный ввод. Она возвращает немедленно значение
t, если есть доступный ввод,nil, в противном случае. В редких случаях она может вернутьt, когда ввода нет.Если необязательный аргумент check-timers не является
nil, то если ввода нет, Emacs выполняет любые таймеры, которые готовы. См. Таймеры.
- Переменная: last-input-event
-
Эта переменная записывает последнее событие ввода терминала, которое было прочитано, будь то как часть команды или явно программой Lisp.
В примере ниже программа Lisp считывает символ 1, код ASCII 49. Он становится значением
last-input-event, в то время как C-e (мы предполагаем, что используется команда C-x C-e для оценки этого выражения) остается значениемlast-command-event.(progn (print (read-char)) (print last-command-event) last-input-event) -| 49 -| 5 ⇒ 49
- Макрос: while-no-input body…
-
Этот конструкт выполняет формы body и возвращает значение последней — но только если не поступает ввод. Если во время выполнения форм body поступает какой-либо ввод, он прерывает их (работает так же, как и команда выхода). Форма
while-no-inputвозвращаетnil, если прервана реальным выходом, и возвращаетt, если прервана поступлением другого ввода.Если часть body связывает
inhibit-quitс не-nil, поступление ввода во время этих частей не приведет к прерыванию до конца этой части.Если вы хотите иметь возможность отличать все возможные значения, вычисленные body, от обоих типов условий прерывания, напишите код так:
(while-no-input (list (progn . body)))
- Переменная: while-no-input-ignore-events
-
Эта переменная позволяет указать, какие специальные события
while-no-inputдолжны игнорироваться. Это список символов событий (см. Примеры событий).
- Функция: discard-input
-
Эта функция отбрасывает содержимое буфера ввода терминала и отменяет любой макрос клавиатуры, который мог быть в процессе определения. Возвращает
nil.В следующем примере пользователь может ввести несколько символов сразу после начала оценки формы. После того, как
sleep-forзавершит ожидание,discard-inputотбросит любые символы, набранные во время ожидания.(progn (sleep-for 2) (discard-input)) ⇒ nil
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/Event-Input-Misc.html