本节介绍如何预读事件而不消耗它们、如何检查待处理输入,以及如何丢弃待处理输入。
另请参见函数 read-passwd(see 读取密码)。
该变量存储等待作为命令输入被读取的事件列表。事件按其在列表中的顺序被使用, 且在使用时逐个从列表中移除。
该变量的存在是因为某些情况下,函数读取一个事件后可能决定不使用它。 将事件存入此变量后,命令循环或读取命令输入的函数会正常处理该事件。
例如,实现数字前缀参数的函数会读取任意数量的数字字符。当它遇到非数字事件时, 必须将该事件回退(unread),以便命令循环能够正常读取它。 同样,增量搜索功能会使用此特性来回退那些在搜索中无特殊含义的事件, 因为这些事件应当退出搜索并正常执行。
从按键序列中提取事件并放入 unread-command-events 的可靠且简便的方法,
是使用 listify-key-sequence(见下文)。
通常你需要将事件添加到该列表的头部,这样最近回退的事件会被优先重新读取。
从该列表中读取的事件,通常不会被添加到当前命令的按键序列中(例如 this-command-keys
的返回值),因为这些事件在首次被读取时已经被添加过一次。
形式为 (t . event) 的元素会强制将 event 添加到当前命令的按键序列中。
从该列表中读取的元素,通常会被记录功能(see Recording Input)
和键盘宏定义过程(see 键盘宏)所记录。
但形式为 (no-record . event) 的元素,会让 event 被正常处理但不被记录。
该函数将字符串或向量类型的 key 转换为单个事件组成的列表,
你可以将此列表放入 unread-command-events 中。
该函数判断当前是否有可读取的命令输入。它会立即返回:
若有可用输入则返回 t,否则返回 nil。
极少数情况下,即使无可用输入,它也可能返回 t。
若可选参数 check-timers 非 nil,则当无可用输入时,Emacs 会运行所有就绪的计时器。
See Timers for Delayed Execution。
该变量记录最后一个从终端读取的输入事件,无论该事件是作为命令的一部分读取, 还是由 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 表达式期间有任何输入到达,会终止这些表达式的执行(行为与退出操作类似)。
如果被真正的退出操作中止,while-no-input 返回 nil;
如果被其他输入的到达中止,则返回 t。
若 body 中的某部分将 inhibit-quit 绑定为非 nil,
则在该部分执行期间到达的输入,要等到该部分执行结束后才会触发中止。
如果你希望能够区分 body 计算出的所有可能值与两种中止情况, 可以按如下方式编写代码:
(while-no-input
(list
(progn . body)))
该函数丢弃终端输入缓冲区中的所有内容,并取消任何可能正在定义过程中的键盘宏。
它返回 nil。
在以下示例中,用户可能在开始执行该表达式后立即输入多个字符。
当 sleep-for 休眠结束后,discard-input 会丢弃休眠期间输入的所有字符。
(progn (sleep-for 2)
(discard-input))
⇒ nil