每个事件都有一个 事件类型(event type),该类型用于按键绑定目的对事件进行分类。 对于键盘事件,事件类型等于事件值;因此,字符的事件类型就是该字符, 功能键符号的事件类型就是符号本身。对于列表形式的事件,事件类型是列表 CAR 位置的符号。因此,事件类型始终是一个符号或一个字符。
就按键绑定而言,同一类型的两个事件是等价的;因此,它们总是执行相同的命令。 但这并不意味着它们做同样的事情,因为某些命令会查看整个事件来决定行为。 例如,某些命令会使用鼠标事件的位置来决定在缓冲区中的操作位置。
有时,更宽泛的事件分类会很有用。例如,你可能想知道某个事件是否使用了 META 键,而不管同时使用了哪个其他按键或鼠标按钮。
Emacs 提供了 event-modifiers 和 event-basic-type 函数
来方便地获取这类信息。
此函数返回 event 所带有的修饰符列表。修饰符是符号,
包括 shift、control、meta、alt、hyper
和 super。此外,鼠标事件符号的修饰符列表总会包含
click、drag、down 中的一个。
对于双击或三击事件,还会包含 double 或 triple。
参数 event 可以是完整的事件对象,也可以只是事件类型。
如果 event 是一个在当前 Emacs 会话中从未作为输入事件被读取过的符号,
那么即使 event 实际上带有修饰符,event-modifiers
也可能返回 nil。
以下是一些示例:
(event-modifiers ?a)
⇒ nil
(event-modifiers ?A)
⇒ (shift)
(event-modifiers ?\C-a)
⇒ (control)
(event-modifiers ?\C-%)
⇒ (control)
(event-modifiers ?\C-\S-a)
⇒ (control shift)
(event-modifiers 'f5)
⇒ nil
(event-modifiers 's-f5)
⇒ (super)
(event-modifiers 'M-S-f5)
⇒ (meta shift)
(event-modifiers 'mouse-1)
⇒ (click)
(event-modifiers 'down-mouse-1)
⇒ (down)
点击事件的修饰符列表会显式包含 click,但事件符号名本身
并不包含 ‘click’。类似地,ASCII 控制字符
(如 ‘C-a’)的修饰符列表包含 control,
即使通过 read-char 读取这类事件会返回已去掉控制修饰符位的数值 1。
此函数返回 event 所描述的按键或鼠标按钮,已去掉所有修饰符。
参数 event 与 event-modifiers 中的用法相同。例如:
(event-basic-type ?a)
⇒ 97
(event-basic-type ?A)
⇒ 97
(event-basic-type ?\C-a)
⇒ 97
(event-basic-type ?\C-\S-a)
⇒ 97
(event-basic-type 'f5)
⇒ f5
(event-basic-type 's-f5)
⇒ f5
(event-basic-type 'M-S-f5)
⇒ f5
(event-basic-type 'down-mouse-1)
⇒ mouse-1