下面是一些个人常用的按键绑定:
;;; 窗口对比 (keymap-global-set "C-c w" 'compare-windows)
compare-windows 是一个很实用的命令,用于对比当前窗口与下一个窗口中的文本。它从每个窗口的光标位置开始比对,逐字符移动直到内容不匹配。我经常使用这个命令。
这也展示了如何为所有模式全局设置按键。
设置按键的命令是 keymap-global-set,后面跟着按键绑定。在 .emacs 中,按键写法如下:C-c 代表 Control-C,即同时按住 Ctrl 键和 c 键。w 代表按下 w 键。整个按键组合用双引号包围。(如果绑定的是 META 键而非 CTRL 键,在 .emacs 中应写作 M-c。
See Rebinding Keys in Your Init File in The GNU
Emacs Manual,查看详细说明。)
按键触发的命令是 compare-windows。注意 compare-windows 前面有一个单引号;否则 Emacs 会先尝试求值该符号以获取其值。
双引号、‘C’ 前面的写法以及单引号,这三处是按键绑定中我经常忘记的部分。好在我已经养成习惯,直接查看已有的 .emacs 并参照修改。
按键绑定本身是:C-c w。它将前缀键 C-c 与单个字符 w 组合。这类 C-c 加单个字符的按键组合严格保留给用户自定义使用。(我称其为 自定义专属按键,因为它们仅供个人使用。)你可以放心创建这类按键,不会与他人的按键冲突。如果你为 Emacs 编写扩展,请不要占用这类按键供公共使用,改用 C-c C-w 这类组合。否则专属按键很快就会被用完。
下面是另一个按键绑定,附带注释:
;;; 'occur' 命令按键绑定 ; 我经常使用 occur,因此为其绑定按键: (keymap-global-set "C-c o" 'occur)
occur 命令会在当前缓冲区中列出所有匹配正则表达式的行。如果选区处于激活状态,occur 只在选区内匹配;否则搜索整个缓冲区。
匹配行显示在名为 *Occur* 的缓冲区中,
该缓冲区相当于一个菜单,可直接跳转到对应位置。
下面是取消按键绑定的方法,使其失效:
;;; 取消绑定 'C-x f' (keymap-global-unset "C-x f")
取消绑定是有原因的:我经常误按 C-x f,而本意是按 C-x C-f。结果并没有打开文件,而是意外修改了文本填充宽度,而且几乎总是改成我不想要的宽度。因为我几乎从不重置默认宽度,所以直接取消了该按键。
下面重新绑定一个已有按键:
;;; 将 'C-x C-b' 重绑定为 'buffer-menu' (keymap-global-set "C-x C-b" 'buffer-menu)
默认情况下,C-x C-b 运行 list-buffers 命令,
该命令会在另一个窗口列出缓冲区。
由于我几乎总是想在该窗口进行操作,
因此我更喜欢 buffer-menu 命令,
它不仅列出缓冲区,还会将光标移到该窗口。
历史上,全局按键绑定使用更低层的函数 global-set-key,现在已视为旧版用法。虽然推荐使用 keymap-global-set,但你在很多地方仍会见到 global-set-key。本节第一个例子用旧版写法如下:
(global-set-key "\C-cw" 'compare-windows)
它与 keymap-global-set 非常相似,只是按键格式略有不同。Control-C 写作 \C-c 而非 C-c,按键之间没有空格,比如本例中的 \C-c 和 w。尽管格式不同,文档中为了可读性仍写作 C-c w。
历史上,全局取消按键绑定使用低层函数 global-unset-key,现在也视为旧版用法。其按键格式与 global-set-key 一致。本节取消按键的例子可改写为:
;;; Unbind 'C-x f' (global-unset-key "\C-xf")