手指疼,寫點代碼緩解一下

我常用Emacs來幹寫字的活——有時候是寫代碼、有時候是用org-mode管理待辦事項、有時候是用restclient-mode來測試HTTP API。Emacs豐富的快捷鍵讓我能夠雙手不離主鍵盤區就作到不少事情,不過這也帶來了別樣的煩惱:快捷鍵按多了,手容易累。git

致使手累的第一個因素,是Emacs的很多快捷鍵須要按住ctrl來使用,而ctrl經常不容易按到。以個人鍵盤爲例,ctrl鍵分佈在主鍵盤區的最外側github

爲了便於尾指按到兩側的ctrl鍵,我在macOS中交換了commandcontrol鍵的效果json

當須要按住兩邊的ctrl鍵(實際按下的是上面照片中的Windows圖標鍵)時,手腕須要往外拐過去。這個問題在使用VSCode時一樣存在,由於我在VSCode中用的也是Emacs的鍵映射。vim

第二個因素是Emacs的一些快捷鍵太繁瑣,致使使用時雙手像在鍵盤上起舞通常處處按來按去,敲擊次數過多。例如,讓光標上下左右移動的快捷鍵分別是ctrl-pctrl-nctrl-b,以及ctrl-f,這比直接用鍵盤上的方向鍵麻煩得多。有一些功能甚至要按三組快捷鍵,好比org-clock-out要先按ctrl-c,再按ctrl-x,最後按ctrl-oide

有沒有辦法既能夠保留快捷鍵的高效,又儘可能地減小擊鍵致使的手腕和手指的疲勞呢?工具

固然有。測試

在Emacs中改用Vim的快捷鍵

既然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中改用Vim的快捷鍵

搬磚的工具是VSCode,用來寫Node.js的項目,主要是因VSCode在寫Node.js代碼這方面確實比Emacs的js-modejs2-mode,以及tide-mode之流要好用那麼一點。在VSCode中我也改用了Vim的鍵映射,只須要在插件市場中點擊安裝便可

VSCode的Vim鍵映射其實是一個獨立的插件Vim,它也支持進一步地自定義快捷鍵。出於我的喜愛,我把s綁定爲保存文件的功能

// VSCode的配置文件setting.json
"vim.normalModeKeyBindings": [
  {
    "before": ["s"],
    "commands": [
      "workbench.action.files.save"
    ]
  }
],

用BetterTouchTools補充evil-mode的不足

儘管在Emacs中能夠將經常使用的功能綁定到一系列的、以g開頭的較短的快捷鍵上,但這一招並不能用來處理全部的快捷鍵,由於太多的自定義快捷鍵也會帶來記憶上的負擔。但我不會就此止步。

仔細觀察就會發現,多數較長的快捷鍵是以ctrl-cctrl-x做爲前綴的。所以,若是可以讓ctrl-cctrl-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將F9F12都重定義了一遍

如此一來,當我須要輸入複雜的、含有ctrl-cctrl-x的快捷鍵的時候,只須要單擊一次F10F11就足夠了,垂手可得!

遺憾的是,BTT是一款macOS only的軟件。

後記

或許腦機接口才是緩解手指勞損的終極解決方案吧。

閱讀原文

相關文章
相關標籤/搜索