Spec-Zone.ru › Elisp

Дополнительные функции ввода событий

В этом разделе описывается, как предварительно просмотреть события, не используя их, как проверить наличие ожидаемого ввода и как отбросить ожидаемый ввод. См. также функцию 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

Spec-Zone.ru

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