Emacs 使用 按键映射(keymaps) 记录哪些按键调用哪些命令。当你使用 keymap-global-set 为某个命令设置全局按键绑定时,实际上是在 current-global-map 中指定绑定。
特定模式(如 C 模式或文本模式)有各自的按键映射;模式专属映射会覆盖所有缓冲区共享的全局映射。
keymap-global-set 函数用于绑定或重绑定全局按键映射。例如,下面将 C-x C-b 绑定到函数 buffer-menu:
(keymap-global-set "C-x C-b" 'buffer-menu)
模式专属按键映射使用 keymap-set 函数绑定,它接收具体映射、按键和命令作为参数。例如,下面表达式将 texinfo-insert-@group 命令绑定到 C-c C-c g:
(keymap-set texinfo-mode-map "C-c C-c g" 'texinfo-insert-@group)
历史上,按键映射使用低层函数 define-key,现在视为旧版用法。虽然推荐使用 keymap-set,但你仍会在很多地方见到 define-key。上面的按键绑定用旧版写法如下:
(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"))
(当然,我也可以用缩写模式减少输入,不必专门写函数插入一个单词;但我希望按键风格与其他 Texinfo 模式绑定保持一致。)
你会在 loaddefs.el 以及各种模式库(如 cc-mode.el 和 lisp-mode.el)中看到大量 keymap-set 和 define-key 表达式。
See Customizing Key Bindings in The GNU Emacs Manual,以及 Keymaps in The GNU Emacs Lisp Reference Manual,获取更多关于按键映射的信息。