鍵盤是很多人經(jīng)常使用的工具。打字機(jī)的鍵盤用于打字,但電腦的鍵盤不只用于打字,更多情況用于控制軟件的行為。但鍵盤的鍵位還是以字母鍵為主,控制鍵基本位于不好按的邊緣位置。但軟件默認(rèn)快捷鍵基本都是 Ctrl + a、Alt + b、Ctrl + Alt + c 這樣,并不好按。更重要的是,除了 Vim 等少數(shù)軟件,多數(shù)軟件在非文字編輯狀態(tài)是不響應(yīng)直接的字母按鍵的,控制這樣的軟件,放著手指正下方下的字母鍵不能用,卻要去找邊邊角角的 Ctrl、Alt、Win、Home、End、PgUp、PgDn 等按鍵十分不合常理。
其實(shí)效率只是一方面,我不是很注重的一方面。在我看來,電腦是各種機(jī)器的結(jié)合體,比如聽歌看電影時(shí)是播放器,看書看圖片時(shí)是瀏覽器,存放文件時(shí)是存儲(chǔ)器,而打字機(jī)也只是其中的一種機(jī)器,而且對(duì)于很多人來說,并不是最常用的一種。當(dāng)我用單獨(dú)的字母按鍵操縱一臺(tái)電腦時(shí),我感覺這真的是一臺(tái)機(jī)器,每個(gè)按鍵都是一個(gè)按鈕,按下去就給機(jī)器發(fā)送了指令,控制這臺(tái)機(jī)器會(huì)用一種淋漓暢快的感覺。但如果我只能按 Ctrl、Alt 這些輔助鍵的同時(shí)再按字母,才能實(shí)現(xiàn)一種功能,那這只是偽裝成另一種機(jī)器的打字機(jī),并不是一個(gè)鍵還是兩個(gè)鍵的問題,這有著本質(zhì)的不同。
提到單按鍵功能,不得不提 Vim 。提起 Vim 的特點(diǎn),很多人說多模式。這確實(shí)是很重要的特點(diǎn),但我感覺這不是最基本或者最重要的。最基本也最重要的特點(diǎn)是單字母鍵即功能。Vim 是多模式,一方面因?yàn)殒I盤按鍵數(shù)量有限,另一個(gè)很重要的原因是 Vim 是編輯器,在操作編輯器時(shí),鍵盤兼任輸入字母和控制功能兩部分工作,如果單字母即功能,必然要實(shí)現(xiàn)成多模式。這也造成了 Vim 操作的復(fù)雜性,Vim 沒有變成編輯器的主流(雖然用戶已經(jīng)不少了)。
但并不是所有的軟件都這樣。除了文字編輯器,我們?cè)谑褂闷渌蠖鄶?shù)軟件的過程中,很少需要輸入文字,多數(shù)情況是在給軟件發(fā)生一個(gè)特定的指令來控制某個(gè)功能,比如讓播放器播放下一首歌,讓瀏覽器顯示一個(gè)超鏈接的內(nèi)容。這樣的軟件,應(yīng)該讓單字母鍵成為功能鍵(同時(shí)不用像 Vim 那樣設(shè)計(jì)成多模式),而不是使用復(fù)雜的Ctrl、Alt等。但因?yàn)榉N種原因,很少有軟件這么做,導(dǎo)致在很多人看來,快捷鍵都成了擺設(shè),除了寥寥幾個(gè)非常常用的,記不住,不好按,還不如直接點(diǎn)菜單。
個(gè)人感覺,可以考慮給軟件實(shí)現(xiàn)這樣一個(gè)交互界面。在主界面可見的功能附近都顯示一個(gè)字母,直接按字母和用鼠標(biāo)操作是相同的。對(duì)于主界面不可見的功能,可以方便調(diào)出按鍵提示,顯示其他按鍵對(duì)應(yīng)的功能是什么,作為菜單的一種替代。而連續(xù)的多個(gè)按鍵,作為子菜單的替代。當(dāng)功能過多時(shí),可以考慮使用 Ctrl、Alt 等組合鍵,但是在單字母已經(jīng)不夠用的情況下。用帶說明的快捷鍵列表代替菜單,有很多好處。因?yàn)椴藛尾⒉皇且粋€(gè)很好的設(shè)計(jì),它當(dāng)然有它的優(yōu)點(diǎn),比如直觀、形象,如果只是試用一下這個(gè)軟件,那么很好。但操作便捷性上很成問題,而且難于記憶。當(dāng)我使用了幾次用 p 鍵來發(fā)播放器的播放指令后,我就可以記住了。但如果播放功能在菜單的第 4 項(xiàng),即使我用了幾十次,還很難記住它的位置,更不會(huì)通過數(shù)字 4 來直接觸發(fā)這個(gè)功能(菜單上有快捷鍵就是另一回事了,這個(gè)菜單本身無關(guān))。當(dāng)一個(gè)軟件菜單欄布滿密密麻麻的菜單,有些菜單還有幾層子菜單,有些功能對(duì)應(yīng)著莫名其妙的復(fù)雜快捷鍵,其余功能直接沒有快捷鍵,就可以想想這個(gè)軟件的長(zhǎng)期用戶是怎樣的痛苦了。
當(dāng)然這只是題外話?,F(xiàn)有的軟件已經(jīng)是這樣了,我們不可能重新開發(fā)一遍,但這并不意味我們沒有其他辦法改善操作體驗(yàn)。
再來仔細(xì)看一下我們熟悉的鍵盤:

正常情況我們的手是在 asdf jkl; 空格 左Alt(左拇指一般能落在左Alt鍵上,但右拇指一般只能落在空格鍵上,不然很不舒服) 10個(gè)鍵上的。只有按這10個(gè)鍵是不用移動(dòng)手指的,也是最方便的。
退而求其次的話,只移動(dòng)一個(gè)鍵位就能按到的,有幾乎全部的其余字母鍵、'、CapsLock、/、Shift、右Alt。而常用的Ctrl、Tab、Esc、回車、方向鍵、編輯區(qū)鍵等繼續(xù)被排除在外了。以我通常的經(jīng)驗(yàn),在以上這些鍵之外,盲打的錯(cuò)誤率會(huì)顯著提高,即使像我這樣的電腦愛好者,也無法做到盲打頂端數(shù)字鍵、編輯區(qū)鍵(Home、PgUp之類,筆記本鍵盤的鍵位還不統(tǒng)一)、F1~F12、和部分符號(hào)鍵。即使有人熟練到能全鍵盤盲打,打這些邊邊角角的鍵和打字母的效率也是不一樣的。也就是說,對(duì)于多數(shù)人,除了字母鍵和少數(shù)控制鍵,按其他鍵之前都是需要先看下鍵盤的。
可以想象如果一個(gè)軟件的快捷鍵都是Ctrl + F3、Alt + F6、Shift + End 這些,一方面需要記憶這些和功能幾乎不相干的按鍵,一方面又要看鍵盤上的按鍵位置,有多少人愿意用,除非某個(gè)功能太常用了,已經(jīng)形成條件反射了(比如Alt + f4,很多人都知道和使用這個(gè)快捷鍵,幾乎是一個(gè)奇跡,但有人能記得Alt + f3在某個(gè)軟件有什么功能嗎)。
但如果釋放單字母鍵的控制功能,那么a-z直接就有了26個(gè)功能,對(duì)于不復(fù)雜的軟件已經(jīng)足夠了。如果不夠的話,Alt加字母,又有26個(gè)。如果還不夠,Shift加字母,也就是大寫字母,又是26個(gè)。Alt和Shift都要比Ctrl好按。如果還不夠,Ctrl加字母,又26個(gè)。已經(jīng)超過100個(gè)了,什么軟件還不夠用?軟件操作確實(shí)復(fù)雜得很的話,上雙字母鍵,26*26,直接676個(gè),即使是雙字母鍵,也比Ctrl+數(shù)字鍵好按,有必要上Ctrl+F1、Ctrl+Shift+e這些不好按或者復(fù)雜按鍵嗎?
用單字母鍵的另一個(gè)優(yōu)勢(shì),在于字母是可以和功能相關(guān)的。比如在文件處理器中,我要編輯一個(gè)文件,Edit,我首先就想到了e,這幾乎是不用記憶的事情。但如果這個(gè)快捷鍵是ctrl+e,就不一樣了,我想到了e,但還得接著想是ctrl+e呢,還是alt+e呢,甚至ctrl+shift+e?復(fù)雜性劇增。算了,想不起來了,還是去找菜單吧……
那么如何安排這些字母呢?
我們可以先了解下現(xiàn)在系統(tǒng)和軟件是如何使用組合鍵的,以Windows系統(tǒng)為例,Linux和Windows差別不大,OSX有些不同,但道理上差不多的。
Win 鍵:用于系統(tǒng)功能。比如打開搜索框、文件管理器、系統(tǒng)配置界面、投影設(shè)置等。但并未占滿所有 Win+字母,少有其他軟件使用 Win 鍵。
Ctrl 鍵:一般是軟件中的首選組合鍵。如果軟件想添加一個(gè)快捷鍵,一般從 Ctrl + 字母數(shù)字開始。系統(tǒng)自身很少用Ctrl鍵。
Alt 鍵:系統(tǒng)中用于窗口、菜單等操作,比如關(guān)閉窗口、打開菜單、定位控件等,一般 Alt + 字母鍵不直接對(duì)應(yīng)軟件的某項(xiàng)具體功能。
Shift 鍵:一個(gè)只用于輸入大寫字母。另外當(dāng)軟件的 Ctrl + 字母數(shù)字不夠用時(shí),一般會(huì)用 Ctrl + Shift + 字母數(shù)字,這是一系列非常難按的快捷鍵,而且一般人都很難記住。
F1~F12:某些軟件會(huì)將其作為功能鍵,但不是很多。除了直接使用,還有用 Ctrl + F1~F12 的情況,異常難按的組合。
右 Alt 鍵、右 Ctrl 鍵和右 Shift 鍵:功能一般和左邊的一樣,但人們一般習(xí)慣按左邊的,很少按右邊的。也確實(shí)比左邊的難按(右拇指要移動(dòng)才能按到右 Alt,右小指要應(yīng)付的符號(hào)鍵太多了,顧不上右 Ctrl 和右 Shift 了)。
編輯區(qū)鍵(Home、Delete、Backspace等):除了常用的 Delete、Backspace,其他的幾乎都成了雞肋。很多使用多年電腦的人甚至沒按過幾次 PgUp 和 PgDn(包括我)。而 Backspace 和 Delete 都不大好按,尤其是 Delete,位置還和具體鍵盤有關(guān),但它太重要了,不好按也得按。
方向鍵:比較常用的按鍵,但需要把手整體移動(dòng)到鍵盤右下方才能按到,非常不方便。
回車鍵:幾乎是整個(gè)鍵盤最重要的按鍵了(打字時(shí)(英文直接打空格,中文選字詞)最重要的是空格,控制時(shí)最重要的是回車,雖然某些界面上空格和回車是一樣的功能,但按空格總感覺有些沒底,沒有回車靠譜,比如空格總?cè)菀锥喟磶讉€(gè))。但這么重要的按鍵需要照顧很多按鍵的右小指移動(dòng)兩個(gè)鍵位才能按到,真是苦了它了。
那我們?cè)O(shè)想重新安排一下按鍵,先從系統(tǒng)功能開始。
已有的幾個(gè) Win + 字母 快捷鍵是不用動(dòng)的,而且有的改不了(比如 Win + l)。但除此之外還有一些未使用的 Win + 字母。因?yàn)?Win 按鍵不如左 Alt 和 Shift 好按,可以設(shè)置一些不常用的全局功能。比如啟動(dòng)某些常用的軟件。一般常用的軟件有限,剩余的字母基本夠用了,如果不夠的話,剩下的基本都不是那么常用的了,估計(jì)也未必能記得住快捷鍵,可以用在快捷啟動(dòng)軟件(如 Launchy)直接敲軟件名。
除了系統(tǒng)功能,剩下的就都和具體的軟件相關(guān)了。
首先我們需要一系列全局快捷鍵,用來解決回車、Backspace、Delete、方向鍵等常用按鍵位置別扭、窗口操作快捷鍵復(fù)雜等問題??紤]到鍵盤上最好按的組合鍵是左 Alt (左拇指可以直接放在上邊),所以非左 Alt + 字母莫屬。這一系列快捷鍵在所有軟件都是可用的,因?yàn)榛緵]有軟件直接用 Alt + 字母作為功能鍵,所以基本上說可行的。對(duì)于不常用的 Alt 定位控件場(chǎng)景,可以用右 Alt 操作(右拇指按右 Alt 相對(duì)還是比較方便的,沒有右 Ctrl 和右 Shift那么難堪)。
然后剩余的按鍵都?xì)w具體軟件所屬了,也就是同一個(gè)快捷鍵,在不同的軟件的功能很可能是不一樣的。
首先安排的自然是單字母鍵,26個(gè),用來處理最常用的功能。設(shè)置時(shí),要同時(shí)考慮操作的便捷和語(yǔ)義的聯(lián)系。有一些約定俗成的習(xí)慣可以參考,比如j、k、h、l用于方向,q用于退出,e用于編輯,x用來刪除等。但因?yàn)椴煌能浖δ芡耆煌?,不用拘泥于此,具體場(chǎng)景具體分析,按得舒服就好。
如果單字母鍵不夠用了,優(yōu)先考慮左 Shift + 字母,也就是大寫字母,因?yàn)槌俗?Alt 外,最方便的組合鍵就是左 Shift 了(當(dāng)然可以考慮互換 CapsLk 和 Shift,但對(duì) Vim 用戶來說,互換 Esc 和 CapsLk 也許更合適一些)。
如果大寫字母也不夠了,再考慮 Ctrl + 字母,Ctrl 雖然在鍵盤的位置不是很好,但大家 Ctrl + c、Ctrl + v 用習(xí)慣了,倒也還好。
如果還不夠的話,就不要再考慮 Ctrl + Shift 之類組合了,直接上雙鍵吧。但上雙鍵也是有策略的,比如有一個(gè)雙鍵 ad,那么 a 就不能當(dāng)單鍵使用了。但一個(gè) a 換來了 26 個(gè)雙鍵,具體怎么用就好權(quán)衡了。一般拿出幾個(gè)鍵來做雙鍵前綴就可以了,沒有必要大動(dòng)干戈。如果需要超過5個(gè)雙鍵前綴,就需要直接考慮多模式(比如增加一個(gè)命令模式,進(jìn)去后直接敲命令然后回車)了。
當(dāng)然如果以上只是空想就沒什么意思了。
下面是我設(shè)計(jì)的左 Alt 鍵組合功能,這些功能在所有軟件都是可用的(當(dāng)然能否發(fā)揮作用要看具體軟件了):
具體軟件的話,以 Total Commander 為例。因?yàn)槲募僮魇欠浅?fù)雜的,我一共映射了全部小寫字母(包含一些雙鍵)、全部大寫字母、全部 Ctrl + 字母、全部的F1~F12、大部分鍵盤右側(cè)符號(hào)等,一共120多個(gè)按鍵組合,論復(fù)雜可以說無出其右了。當(dāng)然我不可能全部記住,實(shí)際使用時(shí)是可以打開按鍵幫助和補(bǔ)全提示的,要比去菜單找功能方便很多。
最后也是最關(guān)鍵的,如果自己設(shè)計(jì)出了一套適合自己的快捷鍵方案,如何實(shí)現(xiàn)呢?
這就要推薦一下 VimDesktop 軟件。
雖然它名里帶 Vim ,但對(duì)不熟悉 Vim 的朋友也完全使用,可以隨意按照自己的心意修改按鍵。以上的按鍵列表都是默認(rèn)配置中內(nèi)置的。修改的話直接改配置文件就可以,很方便。
比如:
<la-h>=<left>[=normal]
<la-i>=<home>[=normal]
<la-j>=<down>[=normal]
<la-k>=<up>[=normal]
<la-l>=<right>[=normal]
<la-m>=<WindowMax>[=normal]
la即左 Alt,無需文檔就可以看懂按鍵的功能。
如果需要對(duì)某個(gè)軟件定制快捷鍵方案,添加插件也是非常方便的。以自帶的 WinMerge 軟件為例:
WinMerge:
; 功能注釋,可選
vim.comment("<WinMerge_NextDiff>", "下一處不同")
vim.comment("<WinMerge_PrevDiff>", "上一處不同")
vim.comment("<WinMerge_FirstDiff>", "第一處不同")
vim.comment("<WinMerge_LastDiff>", "最后一處不同")
; 省略若干行
; normal模式
vim.mode("normal", "WinMergeWindowClassW")
vim.map("j", "<WinMerge_NextDiff>", "WinMergeWindowClassW")
vim.map("k", "<WinMerge_PrevDiff>", "WinMergeWindowClassW")
vim.map("gg", "<WinMerge_FirstDiff>", "WinMergeWindowClassW")
vim.map("G", "<WinMerge_LastDiff>", "WinMergeWindowClassW")
; 省略若干行
return
<WinMerge_NextDiff>:
Send, !{down}
return
<WinMerge_PrevDiff>:
Send, !{up}
return
<WinMerge_FirstDiff>:
Send, !{home}
return
<WinMerge_LastDiff>:
Send, !{end}
return
; 省略若干行
這里是用按鍵映射來實(shí)現(xiàn)的,如果軟件的功能對(duì)應(yīng)著快捷鍵,這是最容易實(shí)現(xiàn)的方法。如果沒有的話,看看是否有可用的Com對(duì)象、消息接口、命令行工具等,如果都沒有,可以再看下能否模擬菜單點(diǎn)擊,甚至模擬鼠標(biāo)操作。如果都搞不定,那就沒有辦法了。
代碼是 AHK 寫的,AHK 最方便的地方在于:
- 可以很容易地處理按鍵相關(guān)的操作,比如按某些鍵執(zhí)行某些功能。
- 可以用最簡(jiǎn)單的環(huán)境(僅需要一個(gè)不足1M的AutoHotkey.exe,加一個(gè)順手的編輯器),就可以開發(fā)不復(fù)雜的圖形界面軟件(用其他語(yǔ)言或者開發(fā)工具一般要安裝體積龐大的環(huán)境才可以開發(fā))。
- 可以很方便地調(diào)用COM對(duì)象和Win32 API。
用來開發(fā)這樣的軟件實(shí)屬絕配。