22.8.6 事件输入的杂项功能

本节介绍如何预读事件而不消耗它们、如何检查待处理输入,以及如何丢弃待处理输入。 另请参见函数 read-passwd(see 读取密码)。

Variable: unread-command-events

该变量存储等待作为命令输入被读取的事件列表。事件按其在列表中的顺序被使用, 且在使用时逐个从列表中移除。

该变量的存在是因为某些情况下,函数读取一个事件后可能决定不使用它。 将事件存入此变量后,命令循环或读取命令输入的函数会正常处理该事件。

例如,实现数字前缀参数的函数会读取任意数量的数字字符。当它遇到非数字事件时, 必须将该事件回退(unread),以便命令循环能够正常读取它。 同样,增量搜索功能会使用此特性来回退那些在搜索中无特殊含义的事件, 因为这些事件应当退出搜索并正常执行。

从按键序列中提取事件并放入 unread-command-events 的可靠且简便的方法, 是使用 listify-key-sequence(见下文)。

通常你需要将事件添加到该列表的头部,这样最近回退的事件会被优先重新读取。

从该列表中读取的事件,通常不会被添加到当前命令的按键序列中(例如 this-command-keys 的返回值),因为这些事件在首次被读取时已经被添加过一次。 形式为 (t . event) 的元素会强制将 event 添加到当前命令的按键序列中。

从该列表中读取的元素,通常会被记录功能(see Recording Input) 和键盘宏定义过程(see 键盘宏)所记录。 但形式为 (no-record . event) 的元素,会让 event 被正常处理但不被记录。

Function: listify-key-sequence key

该函数将字符串或向量类型的 key 转换为单个事件组成的列表, 你可以将此列表放入 unread-command-events 中。

Function: input-pending-p &optional check-timers

该函数判断当前是否有可读取的命令输入。它会立即返回: 若有可用输入则返回 t,否则返回 nil。 极少数情况下,即使无可用输入,它也可能返回 t

若可选参数 check-timersnil,则当无可用输入时,Emacs 会运行所有就绪的计时器。 See Timers for Delayed Execution

Variable: last-input-event

该变量记录最后一个从终端读取的输入事件,无论该事件是作为命令的一部分读取, 还是由 Lisp 程序显式读取。

在以下示例中,Lisp 程序读取字符 1ASCII 编码 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
Macro: while-no-input body…

该结构执行 body 中的表达式,并返回最后一个表达式的值——但仅在无输入到达时生效。 若在执行 body 表达式期间有任何输入到达,会终止这些表达式的执行(行为与退出操作类似)。 如果被真正的退出操作中止,while-no-input 返回 nil; 如果被其他输入的到达中止,则返回 t

body 中的某部分将 inhibit-quit 绑定为非 nil, 则在该部分执行期间到达的输入,要等到该部分执行结束后才会触发中止。

如果你希望能够区分 body 计算出的所有可能值与两种中止情况, 可以按如下方式编写代码:

(while-no-input
  (list
    (progn . body)))
Variable: while-no-input-ignore-events

该变量允许设置 while-no-input 应当忽略哪些特殊事件。 其值为事件符号组成的列表(see 事件示例)。

Function: discard-input

该函数丢弃终端输入缓冲区中的所有内容,并取消任何可能正在定义过程中的键盘宏。 它返回 nil

在以下示例中,用户可能在开始执行该表达式后立即输入多个字符。 当 sleep-for 休眠结束后,discard-input 会丢弃休眠期间输入的所有字符。

(progn (sleep-for 2)
       (discard-input))
     ⇒ nil

emacs

Emacs

org-mode

Orgmode

Donations

打赏

Copyright

© Jasper Hsu

Creative Commons

Creative Commons

Attribute

Attribute

Noncommercial

Noncommercial

Share Alike

Share Alike