В этом разделе описывается, как предварительно просматривать события, не используя их, как проверять наличие ожидающего ввода и как отбрасывать ожидающий ввод. См. также функцию read-passwd (см. Чтение пароля).
Эта переменная содержит список событий, ожидающих чтения в качестве командного ввода. События используются в порядке их появления в списке и удаляются по одному по мере использования.
Эта переменная необходима, потому что в некоторых случаях функция считывает событие, а затем решает его не использовать. Хранение события в этой переменной гарантирует, что оно будет обработано нормально, циклом команд или функциями для чтения командного ввода.
Например, функция, реализующая числовые префиксные аргументы, считывает любое количество цифр. Когда она находит событие, не являющееся цифрой, она должна отменить чтение события, чтобы оно могло быть нормально прочитано циклом команд. Точно так же инкрементальный поиск использует эту функцию для отмены чтения событий, не имеющих особого значения для поиска, поскольку эти события должны выйти из поиска, а затем выполниться нормально.
Надежный и простой способ извлечения событий из последовательности клавиш для помещения их в unread-command-events — использовать listify-key-sequence (см. ниже).
Обычно вы добавляете события в начало этого списка, чтобы наиболее недавно прочитанные события были прочитаны в первую очередь.
События, прочитанные из этого списка, обычно не добавляются в последовательность клавиш текущей команды (как возвращает, например, this-command-keys), поскольку события уже были добавлены один раз при первом чтении. Элемент вида (t . event) принудительно добавляет event в последовательность клавиш текущей команды.
Элементы, прочитанные из этого списка, обычно записываются функциями сохранения (см. Сохранение ввода) и при определении макроса клавиатуры (см. Макросы клавиатуры). Однако элемент вида (no-record . event) заставляет event обрабатываться нормально без записи.
Эта функция преобразует строку или вектор key в список отдельных событий, который вы можете поместить в unread-command-events.
Эта функция определяет, доступен ли в настоящее время какой-либо командный ввод для чтения. Она немедленно возвращает t, если доступен ввод, и nil в противном случае. В редких случаях она может вернуть t, когда ввод недоступен.
Если необязательный аргумент check-timers не равен nil, то, если ввод недоступен, Emacs выполняет все готовые таймеры. См. Таймеры для отложенного выполнения.
Эта переменная записывает последнее прочитанное событие терминала, независимо от того, было ли это в рамках команды или явно с помощью программы 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
Эта конструкция выполняет формы body и возвращает значение последней из них — но только если не поступает ввод. Если во время выполнения форм body поступает какой-либо ввод, он прерывает их (работает очень похоже на quit). Форма while-no-input возвращает nil, если прервана реальным выходом, и возвращает t, если прервана поступлением другого ввода.
Если часть body устанавливает inhibit-quit в не-nil, поступление ввода во время этих частей не вызовет прерывания до конца этой части.
Если вы хотите иметь возможность различать все возможные значения, вычисленные body, и оба типа условий прерывания, напишите код так:
(while-no-input
(list
(progn . body)))
Эта переменная позволяет указать, какие специальные события while-no-input следует игнорировать. Это список символов событий (см. Примеры событий).
Эта функция отбрасывает содержимое буфера ввода терминала и отменяет любой макрос клавиатуры, который может находиться в процессе определения. Она возвращает nil.
В следующем примере пользователь может набрать несколько символов сразу после начала вычисления формы. После завершения sleep-for ожидания discard-input отбрасывает любые символы, набранные во время сна.
(progn (sleep-for 2)
(discard-input))
⇒ nil