16.8 键位映射

Emacs 使用 键位映射 记录哪些键调用哪些命令。当你使用 global-set-key 在 Emacs 的所有部分为单个命令设置键绑定时,你正在指定键绑定在 current-global-map 中。

特定模式,如 C 模式或文本模式,有它们自己的键位映射;模式特定的键位映射会覆盖所有缓冲区共享的全局映射。

global-set-key 函数绑定或重新绑定全局键位映射。例如,下面将键 C-x C-b 绑定到函数 buffer-menu

(global-set-key "\C-x\C-b" 'buffer-menu)

模式特定的键位映射使用 define-key 函数进行绑定,该函数接受特定的键位映射作为参数,以及键和命令。例如,我的 .emacs 文件包含以下表达式,将命令 texinfo-insert-@group 绑定到键 C-c C-c g

(define-key texinfo-mode-map "\C-c\C-cg" 'texinfo-insert-@group)

texinfo-insert-@group 函数本身是对 Texinfo 模式的一个小扩展,它在 Texinfo 文件中插入 ‘@group’。我经常使用这个命令,而且更喜欢输入三个按键 C-c C-c g,而不是六个按键 @ g r o u p。 (‘@group’ 及其匹配的 ‘@end group’ 是一对命令,将所有包含的文本保持在一页上;本书中的许多多行示例都被 ‘@group … @end group’ 包围。)

以下是 texinfo-insert-@group 函数的定义:

(defun texinfo-insert-@group ()
  "在 Texinfo 缓冲区中插入字符串 @group。"
  (interactive)
  (beginning-of-line)
  (insert "@group\n"))

(当然,我本可以使用 Abbrev 模式来节省输入,而不是编写一个插入单词的函数;但我更喜欢与其他 Texinfo 模式键绑定一致的按键。)

loaddefs.el 以及各种模式库如 cc-mode.ellisp-mode.el 中,你会看到许多 define-key 表达式。

See 定制键绑定 in GNU Emacs 手册, 以及 键位映射 in GNU Emacs Lisp 参考手册,获取更多关于键位映射的信息。