23.3 按键映射的格式

每个按键映射都是一个列表,其首个元素(CAR)为符号 keymap。 列表的其余元素定义了该按键映射的按键绑定。函数定义为按键映射的符号本身也属于按键映射。 可使用函数 keymapp(见下文)检测一个对象是否为按键映射。

在按键映射开头的 keymap 符号之后,可出现以下几种类型的元素:

(type . binding)

该元素为 type 类型的事件指定一个绑定。每个普通绑定都适用于特定事件类型(event type)的事件, 事件类型始终是一个字符或符号(See 事件分类)。在此类绑定中,binding 是一个命令。

(type item-name . binding)

该元素指定的绑定同时也是一个简单菜单项,会在菜单中显示为 item-name(See 简单菜单项)。

(type item-name help-string . binding)

这是一个带有帮助字符串 help-string 的简单菜单项。

(type menu-item . details)

该元素指定的绑定同时也是一个扩展菜单项,支持更多功能特性(See 扩展菜单项)。

(t . binding)

该元素指定默认按键绑定(default key binding):所有未被按键映射中其他元素绑定的事件,都会使用 binding 作为其绑定。 默认绑定允许按键映射无需枚举所有可能的事件类型,即可为所有事件类型设置绑定。 带有默认绑定的按键映射会完全遮蔽所有低优先级的按键映射,但显式绑定为 nil 的事件除外(见下文)。

char-table

若按键映射的某个元素是字符表(char-table),则它会为所有无修饰位的字符事件提供绑定 (see modifier bits):索引为 c 的元素即为字符 c 的绑定。 这是一种紧凑记录大量绑定的方式。包含此类字符表的按键映射被称为完整按键映射(full keymap), 其他按键映射则称为稀疏按键映射(sparse keymap)。

vector

此类元素与字符表类似:索引为 c 的元素即为字符 c 的绑定。 但由于这种方式能绑定的字符范围受向量大小限制,且创建向量时会为从 0 开始的所有字符码分配空间, 因此除创建菜单按键映射(see 菜单按键映射,其绑定本身无实际意义)外,不应使用该格式。

string

除指定按键绑定的元素外,按键映射还可包含字符串类型的元素。该字符串被称为整体提示字符串 (overall prompt string),使按键映射可被用作菜单(See 定义菜单)。

(keymap …)

若按键映射的某个元素本身也是一个按键映射,则等效于将该内部按键映射内联到外部按键映射中。 这一机制用于实现多重继承,例如 make-composed-keymap 函数即采用此方式。

当绑定值为 nil 时,该元素不构成有效定义,但会优先于默认绑定或父映射中的绑定生效。 另一方面,值为 nil 的绑定不会覆盖低优先级的按键映射; 因此,若局部映射中某按键的绑定为 nil,Emacs 会使用全局映射中的对应绑定。

按键映射不会直接记录元字符(meta characters)的绑定。 在按键查找时,元字符会被视为两个字符组成的序列,第一个字符为 ESC (或当前 meta-prefix-char 的值)。因此,按键 M-a 在内部会被表示为 ESC a, 其全局绑定可在 esc-mapa 对应的位置找到(See 前缀键)。

这种转换仅适用于字符,不适用于功能键或其他输入事件; 因此,M-endESC end 毫无关联。

以下是 Lisp 模式的局部按键映射示例(属于稀疏按键映射)。 它为 DELC-c C-zC-M-qC-M-x 定义了绑定 (实际值还包含一个菜单绑定,为简洁起见此处省略)。

lisp-mode-map
⇒
(keymap
 (3 keymap
    ;; C-c C-z
    (26 . run-lisp))
 (27 keymap
     ;; C-M-x, treated as ESC C-x
     (24 . lisp-send-defun))
 ;; This part is inherited from lisp-mode-shared-map.
 keymap
 ;; DEL
 (127 . backward-delete-char-untabify)
 (27 keymap
     ;; C-M-q, treated as ESC C-q
     (17 . indent-sexp)))
Function: keymapp object

该函数在 object 为按键映射时返回 t,否则返回 nil。 更准确地说,该函数会检测对象是否为首个元素是 keymap 的列表, 或函数定义满足 keymapp 的符号。

(keymapp '(keymap))
    ⇒ t
(fset 'foo '(keymap))
(keymapp 'foo)
    ⇒ t
(keymapp (current-global-map))
    ⇒ t

emacs

Emacs

org-mode

Orgmode

Donations

打赏

Copyright

© Jasper Hsu

Creative Commons

Creative Commons

Attribute

Attribute

Noncommercial

Noncommercial

Share Alike

Share Alike