我常用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的軟件。
或許腦機接口才是緩解手指勞損的終極解決方案吧。