TIL: repeat-mode 省去重复按键前缀
按 C-x o C-x o C-x o 切换窗口,或者 C-x { C-x { C-x { 缩小窗口——每次都要重复前缀,很烦。
Emacs 28 内置的 repeat-mode 可以在首次按键后省掉前缀,只按最后一个键就行:
(repeat-mode 1)
开启后,~C-x o o o~ 就能连续切换窗口,~C-x { { {~ 连续缩小。
内置支持的命令
Emacs 自带了一批 repeat map,开箱即用:
| 首次按键 | 后续按键 | 效果 |
|---|---|---|
C-x o |
o |
切换窗口 |
C-x { / C-x } |
{ / } |
水平缩小/扩大窗口 |
C-x ^ |
^ |
垂直扩大窗口 |
C-x u |
u |
撤销 |
C-x <left> / C-x <right> |
<left> / <right> |
切换 buffer |
M-g n / M-g p |
n / p |
跳转下一个/上一个错误 |
按了不在 repeat map 里的键,重复状态自动结束。
也可以设置超时自动退出:
(setq repeat-exit-timeout 5) ;; 5 秒无操作自动退出
自定义 repeat map
以 expreg(expand-region)为例,实现 C-= = = - 即三次展开再一次收缩:
(defvar expreg-repeat-map (let ((map (make-sparse-keymap))) (define-key map "=" #'expreg-expand) (define-key map "-" #'expreg-contract) map)) (put 'expreg-expand 'repeat-map 'expreg-repeat-map) (put 'expreg-contract 'repeat-map 'expreg-repeat-map)
模式很简单:创建 keymap,给命令设置 repeat-map symbol property。任何带这个属性的命令在首次调用后都会进入重复状态。