我常用Emacs来干写字的活——有时候是写代码、有时候是用org-mode管理待办事项、有时候是用restclient-mode来测试HTTP API。Emacs丰富的快捷键让我能够双手不离主键盘区就作到不少事情,不过这也带来了别样的烦恼:快捷键按多了,手容易累。git
致使手累的第一个因素,是Emacs的很多快捷键须要按住ctrl
来使用,而ctrl
经常不容易按到。以个人键盘为例,ctrl
键分布在主键盘区的最外侧github
为了便于尾指按到两侧的ctrl
键,我在macOS中交换了command
和control
键的效果json
当须要按住两边的ctrl
键(实际按下的是上面照片中的Windows图标键)时,手腕须要往外拐过去。这个问题在使用VSCode时一样存在,由于我在VSCode中用的也是Emacs的键映射。vim
第二个因素是Emacs的一些快捷键太繁琐,致使使用时双手像在键盘上起舞通常处处按来按去,敲击次数过多。例如,让光标上下左右移动的快捷键分别是ctrl-p
、ctrl-n
、ctrl-b
,以及ctrl-f
,这比直接用键盘上的方向键麻烦得多。有一些功能甚至要按三组快捷键,好比org-clock-out
要先按ctrl-c
,再按ctrl-x
,最后按ctrl-o
。ide
有没有办法既能够保留快捷键的高效,又尽可能地减小击键致使的手腕和手指的疲劳呢?工具
固然有。测试
既然Emacs默认的快捷键不容易按,那么不妨换成Vim风格的快捷键。一样是上下左右移动光标,在Vim中只须要单击k/j/h/l
这四个按键便可,不只可以单手操做,并且这四个键正好是右手”触手可及“的位置。其它的功能,例如在文件内搜索、保存文件等,也只须要按/
和:w
便可,比起Emacs真是”finger-friendly“得多了。ui
那么如何才能在Emacs中用上Vim的快捷键呢?答案是用evil
插件。先用包管理器安装它spa
M-x package-install RET evil RET
而后在Emacs的启动配置文件中添加启用evil-mode
的代码插件
(require 'evil) (evil-mode 1)
如今即可以在Emacs中使用Vim风格的快捷键了
evil-mode
只是简单地启用evil-mode
还不足以将双手从频繁的按ctrl
中解放出来,由于在Emacs中还有很多其它的高频快捷键依赖于ctrl
,例如用ctrl-x b
来切换到其它的buffer中、用ctrl-x ctrl-f
来打开或新建一个文件,甚至是用ctrl-c ctrl-x ctrl-o
来中止一个任务的计时器。
就像在数据压缩中,用较短的串来代替出现频率较高的原始字符串同样,对于高频使用且快捷键较长的功能,能够为它们绑定较短的快捷键。在evil-mode
中,g
是一个前缀键而且也很好按,因此我把一些重度使用的功能都绑定了在了以它为前缀的快捷键上
;;; evil-mode相关的键绑定 (evil-global-set-key 'normal (kbd "g b") 'ido-switch-buffer) (evil-global-set-key 'normal (kbd "g f") 'ido-find-file) (evil-global-set-key 'normal (kbd "g o") 'org-clock-out) (evil-global-set-key 'normal (kbd "g s") 'cuckoo-org-schedule) (evil-global-set-key 'normal (kbd "g t") 'org-todo) (evil-global-set-key 'normal (kbd "s") 'save-buffer)
搬砖的工具是VSCode,用来写Node.js的项目,主要是因VSCode在写Node.js代码这方面确实比Emacs的js-mode
、js2-mode
,以及tide-mode
之流要好用那么一点。在VSCode中我也改用了Vim的键映射,只须要在插件市场中点击安装便可
VSCode的Vim键映射其实是一个独立的插件Vim,它也支持进一步地自定义快捷键。出于我的喜爱,我把s
绑定为保存文件的功能
// VSCode的配置文件setting.json "vim.normalModeKeyBindings": [ { "before": ["s"], "commands": [ "workbench.action.files.save" ] } ],
尽管在Emacs中能够将经常使用的功能绑定到一系列的、以g
开头的较短的快捷键上,但这一招并不能用来处理全部的快捷键,由于太多的自定义快捷键也会带来记忆上的负担。但我不会就此止步。
仔细观察就会发现,多数较长的快捷键是以ctrl-c
或ctrl-x
做为前缀的。所以,若是可以让ctrl-c
和ctrl-x
更容易按——好比替换为单个按键,也有利于减小尾指按ctrl
键的负担。
要用单键来代替ctrl-c
,光凭Emacs其实也能够作到。好比可让F10
被按下的时候至关于按下ctrl-c
(defun simulate-C-c () "模拟输入C-c" (interactive) (setq unread-command-events (listify-key-sequence "\C-c"))) (global-set-key [f10] 'simulate-C-c)
问题在于它不可组合。
例如,先按F10
再按ctrl-x
,等价于按下ctrl-c ctrl-x
。但若是先按ctrl-x
再按F10
,则Emacs不会再将F10
转换为ctrl-c
,它只会认为我按下的是ctrl-x F10
的键序列。
既要用F10
代替ctrl-c
,又要具有可组合性,怎么办?个人答案是使用BetterTouchTool。我用BTT将F9
到F12
都重定义了一遍
如此一来,当我须要输入复杂的、含有ctrl-c
或ctrl-x
的快捷键的时候,只须要单击一次F10
或F11
就足够了,垂手可得!
遗憾的是,BTT是一款macOS only的软件。
或许脑机接口才是缓解手指劳损的终极解决方案吧。