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.el 和 lisp-mode.el 中,你会看到许多 define-key
表达式。
See 定制键绑定 in GNU Emacs 手册, 以及 键位映射 in GNU Emacs Lisp 参考手册,获取更多关于键位映射的信息。