全域組合鍵 for Windows and Ubuntu 20.04 @ FreelimbO | Saturday, Aug 14, 2021 | 13 minutes read | Update at Saturday, Aug 14, 2021

軟體: AutoHotkey, xev, xbindkeys, xmodmap, Autokey, and xkb.

欲練神功,必先自宮。歷經上一篇自廢武功、自斷經脈丟失上路十二功能鍵、六塊肌、凸字方向鍵、以及九宮格之後,我揪~竟怎麼使用電腦存活在21世紀的今天,答案就是簡單粗暴的組合鍵。回憶當年,當我們學會了ctrl+c、ctrl+v之後,不只是寫作業變得飛快,其實我們同時也開啟了通往新世界的大門呀。

首先我們來想想看失去那40%鍵盤按鍵意味著什麼。上路十二功能鍵其實日常生活不常使用,即便某些App有需求,也很少12顆都必須同時使用。六塊肌:插入、刪除、行首、行尾、上頁、下頁,恩看起來都蠻實用的,可是其中的刪除鍵我們能改用主鍵區的Backspace倒退鍵來滿足,不同之處在於無法原地刪字,必須移動游標到想刪的部份後面在回頭刪,我能辦到,但是就看各人願不願意這樣迂迴一下。凸字方向鍵就是移動游標。九宮格:不只是數字,還有方向跟數學計算符號,但是這些功能除了方向之外,主鍵區也都有了,九宮格只是更加直觀的重排這些按鍵。除此之外,還有四顆比較不常用的鍵也被犧牲了,Print Screen、Scroll Lock、Pause Break、和Num Lock。這些都是全尺寸鍵盤基本要有的,但是60%沒有。然而在丟失的這麼多功能中,個人覺得對我殺傷力最大的就是四個方向鍵、Home、和End,所以以下先就這六個鍵來做示範,讀者覺得不夠用,可以以此類推。

筆者日常使用兩種作業系統:Windows與Ubuntu。目前還沒找到一個共通的全域組合鍵解決方案,所以這裡只能分兩個系統來講解,但是心法是差不多的。找一個修飾鍵(Modifier)來搭配一個英數鍵,然後指定這樣的組合會送出什麼指令或者鍵碼(key code)。我們要在主鍵區找一顆位置上容易按到,但頻率上卻又不常按的鍵,來作為我們的修飾鍵。正在用電腦的讀者可以低頭看一下,正在用手機的讀者閉上眼睛冥想一下,答案非常明顯,只有一顆鍵厚顏無恥的存在於寸土寸金的主鍵區,大多數的人都絕少會使用到它,他的名字叫做Caps_Lock。請你捫心自問,在你一生當中到目前為止你按過幾次Caps_Lock?是不是只有打網路遊戲跟老外用英文對罵的時候,才會開啟Caps_Lock來問候他一家老小?只有在我們需要忘記國際禮儀的時候才需要連續大寫打英文,不是嗎?不可以喔,作人要有禮貌。為了維護國際禮儀,消滅Caps_Lock有益無害。

修飾鍵決定是Caps_Lock之後,接著是組合鍵的第二部份,要選自己喜歡的熟練的英數鍵來搭配。我的話就是使用Vim的移動鍵:h(←)、j(↓)、k(↑)、還有l(→)。

Windows

先說說我在Windows上使用的全域組合鍵解決方案。AutoHotkey,一套開源免費軟體搞定。到下載頁面左上角下載並且安裝。

開啟Windows 的啟動資料夾,按下[Win]+r叫出run command對話框,在框中輸入:

shell:startup

在這啟動資料夾內新增一個純文字文件,貼進下面的程式碼:

#Persistent
SetCapsLockState, AlwaysOff

Capslock & h::Send {Blind}{Left DownTemp}
Capslock & h up::Send {Blind}{Left Up}

Capslock & j::Send {Blind}{Down DownTemp}
Capslock & j up::Send {Blind}{Down Up}

Capslock & k::Send {Blind}{Up DownTemp}
Capslock & k up::Send {Blind}{Up Up}

Capslock & l::Send {Blind}{Right DownTemp}
Capslock & l up::Send {Blind}{Right Up}

Capslock & a::Send {Blind}{Home DownTemp}
Capslock & a up::Send {Blind}{Home Up}

Capslock & e::Send {Blind}{End DownTemp}
Capslock & e up::Send {Blind}{End Up}

第一行告知系統除非使用者中止AutoHotkey,否則持續生效。第二行設定Caps_Lock失去原本的作用,讓他不能再送出固定大寫的指令。接著六組程式碼遵循同一個模板,模板的第一行定義按鍵組合被按下的行為,而第二行定義了放開的行為。這個模板除了修飾字Blind與DownTemp之外應該很容易理解,Blind是盲從的意思,不管原先其他修飾鍵切換到什麼模式,一旦偵測到我這個組合鍵,就先執行我後面的命令。這樣會有一個很有趣的效果,如果剛好我們要搭配其他修飾鍵來使用這個組合鍵,那麼盲從模式的效果有點像是算術四則運算中的括號,調整結合律優先順序,讓我們的組合鍵先組合出方向鍵,然後方向鍵再配合其他修飾鍵進行操作。比方說我們打了一些字,但是想要把其中幾個連續的字標記起來再剪下或複製,我們可以用滑鼠圈選,也可以使用shift+方向鍵,這時因為我們沒有實體方向鍵可用,於是我們按下shift+Caps_Lock+h,這樣就能達到往回圈選的效果了。

DownTemp則是發送這個鍵的同時告知系統如果在收到其他指令,不要假設這個鍵持續被按著。這個修飾字在一般情況等同於Down這個按下修飾字,但是如果你今天的組合鍵是組合出一個修飾鍵,那麼DownTemp就有差了,他會導致接下來再按的鍵不能跟這個組合出來的鍵再組合,好繞口。這裡我們只是送出方向鍵,所以使用Down或者DownTemp是沒有差別的。

模板的第二行定義了釋放組合鍵的行為,這行在大多app裡是多餘的,如果該app不捕捉釋放方向鍵的效果。比方說在文字編輯器中,多數的方向鍵只有在被按下時進行動作,但是你放開的時候並不會另外再有動作。但其實對於電腦而言,他看到的是兩個事件,所以AutoHotkey允許你定義按鍵被釋放時的動作。這邊我們保險起見,也定義了組合出的方向鍵被釋放時的動作。

存檔為"scriptHJKL.ahk",記得修改附檔名為ahk。然後雙擊這個script的圖示就能使其生效(如果系統沒有自動關聯副檔名"ahk"給AutoHotkey,你就需要執行一下AutoHotkey),通常桌面什麼事情都不會發生。但是你如果隨便打開一個網頁,你會發現Caps_Lock+j 可以讓你把網頁往下滑了。其他五個鍵也能開些app來測試一下。Windows的部份就這麼平淡無奇地說完了。

Ubuntu

那麼好用的AutoHotkey,竟然沒有出Ubuntu版本,令人不勝唏噓。沒關係,隨便Google一下也能找到一堆替代方案。網路上比較流行的解法就是xmodmap搭配AutoKey。Xmodmap也是Xorg設計來在X桌面系統做鍵盤按鍵映射的軟體,但是它的功能相當有限,如果只是修改一對一的按鍵對應,它可以輕易完成。但是如果是多鍵對應一鍵的映射,他就跪給你看。AutoKey雖然名字很像Windows上的AutoHotkey, 但是他比較沒那麼Hot, 他也能作到組合鍵多對一的功能,只是…只可惜他殺不死Caps_Lock。於是廣大的Ubuntu使用者才把這兩個軟體兜在一起,讓Xmodmap負責使Caps_Lock失能,且轉移Caps_Lock背後的鍵碼為一個不存在的鍵碼,然後在AutoKey當中使用那個鍵碼來搭配其他英數鍵組成組合鍵,好鍵!好鍵!

一般Linus distribution當中應該都已經安裝了xmodmap,如果你的沒有,那麼你可以使用$ sudo apt install xkeycaps來安裝圖形化界面的xmodmap,同時也可以使用command line來使用。有了Xmodmap之後我們可以在家目錄編寫一個兩個只有一行的scripts:

$ echo "keycode 66 = Hyper_L Hyper_R" > disableCapsLock
$ echo "keycode 66 = Caps_Lock" > enableCapsLock

第一行叫系統複述引號內的文字出來,然後透過">“符號將echo輸出導進文字檔"disableCapsLock"中。而引號內的命令則是要求Xmodmap把Caps_Lock的鍵碼66替代為Linux系統曾經有過但卻又取消的修飾鍵"Hyper”。第二行則是恢復Caps_Lock的鍵碼對應的符號回去"Caps_Lock"。以後我們就可以透過以下兩行指令來使Caps_Lock失能又恢復:

$ xmodmap disableCapsLock
$ xmodmap enableCapsLock

好,能把Caps_Lock變成修飾鍵之後,接著我們使用AutoKey來搞定組合鍵。

$ sudo apt install autokey-gtk
$ autokey&

安裝具有圖形化界面的autokey。第二行叫出autokey。然後"New" -> “Phrase”,在右邊白色框中輸入"",不需包含雙引號,只要包含尖角框。然後右下角Hotkey右邊點選"Set"-> “Press to Set”,接著同時按下Caps_lock與h,就能把Hyper+h指定成把游標往左移動的組合鍵了,設定好之後必須在上方選單按一下"Save"才能開始生效。其他組合鍵也能如法炮製,如果有不知道的symbol可以查閱官方Help網頁

好像沒有比Windows的設定難呀?使用一陣子之後我越來越感覺不對勁,終於意識到這是個坑阿。

第一個問題是,當你在筆電上使用內建的鍵盤之後又外接一個鍵盤來用,鍵盤有改動的時候,Hyper鍵的設定會被 重置。這其實有點煩人,雖然說再執行一次xmodmap的指令就能再使Caps_Lock變成Hyper,但是要是你在使他變成Hyper之前就按過Caps_Lock,那麼接下來切換成Hypere之後你的英打將會全面變成大寫。暈倒,你必須很小心地按著shift 強忍怒意壓制大寫才能輸入指令恢復Caps_Lock並切關閉大寫,然後再切換成Hyper。沒關係,習武之人心如止水,當作修身養性嘛。

再一個問題那就熟不可忍了,如果你也是繁體中文使用者,那麼你會發現在大多數app裡,你都不能使用這套組合方向鍵選字,選字框只要你一按下組合鍵就閃退。只有真實方向鍵能選字,吐血…遍尋網上竟然無解…容我再吐一升血。

全世界的Ubuntu使用者竟然極少跟我一樣使用無實體方向鍵的60%鍵盤同時需要用組合方向鍵來選字詞。老外沒這毛病,他們字母打出來就成定局,不像我們同音字太多,需要方向鍵來做選擇。對岸的使用者也沒這毛病,大概是他們的鍵盤都有方向鍵,或者他們的羅馬拼音極少自動選錯字。

我在網上苦苦搜索,一開始我以為能透過更換輸入法來解,但是是遍了注音、詞音、新酷音跟輸入法框架fcitx、gcin、IBus的排列組合,都一樣有選字框閃退的問題。

好吧,山不轉路轉,讓我找找看有沒有哪款app能夠允許我正確選字,試了好多文字編輯器,能選字的會有殘影有礙觀瞻(Chrome extension for SSH),能選字也不會有殘影的就是游標位址鬧失蹤(Chrome extension for markdown),其他文書編輯軟體則是一碰組合鍵他們就退出選字框(libreOffice, text editor, vim, remarkable, …)太多了。後來終於找到有人解釋了這貌似是GNOME桌面系統都會有的問題,無可避免。想打中文?想要選字?那就去找把有方向鍵的鍵盤吧。崩潰…

正當我萬念俱灰的在網路商城尋找有方向鍵的60%鍵盤的時候,我偶然查到了美國也買得到一把我心中女神等級的鍵盤Leopold FC660M,靜音紅軸,縱使尺寸突破我能接受的大小、雖然要價不菲,但是我曾經實際碰過一把他的親戚,同系列但不同尺寸的鍵盤,我永遠記得那天…

在炎熱的光華商場附近兜轉,汗流浹背,終於找到了那間叫做"XX軍團"在地下室的店,進去跟熱心的老闆講述我想找找看安靜而且手感好的60%鍵盤,老闆就賊嘻嘻的跑走,回來的時候就是拿一把FC980M催促我試試看,我心想鍵盤就鍵盤,有啥好驕傲成這副德性。坐定,上鍵盤。

我閉上眼睛,右手食指不急不徐,不輕不重的按上J鍵,那個觸感濃纖合度,增一分則太肥,減一分則太瘦。那短短不到一秒的鍵程,我的壓按觸底了,世界,彷彿靜止,我的心跳,也突然忘記跳那麼一下。

那種感覺好熟悉,但又好遙遠。好像第一次牽起心儀的女孩子的手,纖細、滑嫩、羞澀、有溫度、有意識、有骨幹、但卻又含情脈脈。我當下五內震撼、血液翻騰。心裡只有那麼一句話,不用再找了,就是他了。

但是當我睜開眼睛,我彷彿被人從天堂打回人間,我還坐在那間地下室裡,周圍的宅男們還是熙熙攘攘,而我眼前的鍵盤還是FC980M這個尺寸我不能接受的大小。我不死心,問老闆這牌的鍵盤有沒有60%,老闆很遺憾的表示沒有,最小就是65%的66鍵FC660M。唉,無奈呀,上天你為何要對我這麼殘忍?絕佳的觸感、靜默的響聲,但卻不是我要的尺寸。

問老闆65%的版本能拿出來我看看嗎?或許我能通融那超出我尺寸臨界點的5%,但是老闆說不是他不想拿出來,而是賣光了拿不出來,所以才推98鍵的FC980M給我。蒼天阿!你讓我遇見了他,卻又註定我跟他沒有結果,可恨、可嘆。

拉回現在,我剛好在Ubuntu中文選字上遇到困難,是不是剛好是個入手FC660M的契機呢?是不是這一切的折騰,都是為了替FC660M找到通往我家的路呢?猶豫阿,FC660M你為什麼不改名叫做FC610M或者FC620M呢?要是你只有61或者62鍵,或許就能塞進60%的尺寸裡了呀。別家也有把方向鍵塞進60%大小的鍵盤,但他們不是Leopold做的靜音紅軸鍵盤呀。彼蒼天阿!何其有極!

消極悲傷了幾天之後冷靜下來,使用xev跟xbindkeys這兩套軟體分析一下我目前解法所送出的按鍵順序,發現應該是Hyper這個修飾鍵還是會被Ubuntu的app所捕捉,縱使是無效按鍵,但是選字框確因為這個無效按鍵而出現錯誤。繼續搜著搜著,無意間竟然搜到了一位德國老兄的解法。他不是針對中文輸入,但卻是在Ubuntu上實現組合鍵的辦法之一。

傳說中,原始的Unix-like電腦與其相對應的遠古鍵盤,有定義著許多修飾鍵,前面所使用會引發錯誤的Hyper鍵只是其中之一。但是其他的還有Meta與Alt-Gr。如果出問題的是Hyper造成的組合鍵,那麼不妨試試看德國老兄的Xmodmap+X11-XKB解決方案。

首先修改前面那個DisableCapsLock檔案

$ echo "keycode 66 = ISO_Level3_Shift" > disableCapsLock

這回我們把Caps_Lock的鍵碼轉成Alt-Gr這個遠古修飾鍵。然後接下來去AutoKey清除所有的組合鍵定義,理論上不會衝突,但我們必須了解接下來是哪個方案成功了。

然後在命令行輸入以下指令編輯Linux更靠近底層的鍵盤映射。

$ cp /usr/share/X11/xkb/symbols/us ./us_backup
$ sudo vi /usr/share/X11/xkb/symbols/us

這是美式鍵盤的映射定義擋,第一行備份一份鍵盤設定檔,你必須有心裡準備萬一哪裡修改錯誤了,你可能在重新登入系統後無法使用鍵盤,只能 遠端SSH登入來復原接下來的修改。第二行在編輯器中開啟這個設定檔。接著在檔案的開頭貼入以下程式碼:

partial keypad_keys
xkb_symbols "altgr-vim" {
    key <CAPS> { [ ISO_Level3_Shift      ] };
    key <AC06> { [ h, H, Left,  Left     ] };
    key <AC07> { [ j, J, Down,  Down     ] };
    key <AC08> { [ k, K, Up,    Up       ] };
    key <AC09> { [ l, L, Right, Right    ] };
    key <AC01> { [ a, A, Home,  Home     ] };
    key <AD03> { [ e, E, End,   End      ] };
};

然後在編輯器中尋找"xkb_symbols “basic” {",找到後在大括號的下一行貼入以下程式碼:

include "us(altgr-vim)"

存檔,登出帳號再登入之後使用$ xmodmap disableCapsLock就能擁有全域的組合方向鍵,並且能夠自由自在地使用組合鍵來選字囉!(那麼FC660M的淒美愛情故事不就沒下文了?!)

如果讀者好奇怎擴充這個對應表,可以遵循這個"altgr-vim"的寫法,把你想配合修飾鍵Alt-Gr的其他鍵碼從同一個檔案的下面找出來,貼進去"altgr-vim"裡面在修改方括號中的symbol,這樣一來就能添加你需要的功能鍵回來了。

© 2016 - 2025 努力不一定會成功,但是不努力就會很輕鬆

Powered by Hugo with theme Dream.

 總瀏覽
關於 FreelimbO

FreelimbO是個奉行一時開箱一時爽,一直開箱一直爽的3C愛好者,同時也是喜歡折騰自己的自虐者,明知有簡單的方法可以花錢了事,但卻偏偏喜歡走土法炮製路線。

這個網誌開始是作者想要在樹莓派上架站寫網誌紀錄在樹莓派上架站寫網誌,但是之後也會持續分享開箱心得、讀書心得、人工智能相關論文閱讀心得、遊戲心得、還有最慘無人道的各種踩坑排雷心得。敬請加入你的書籤,持續關注最新文章,謝謝。

Social Links
The copyright of the content in this site is protected by DMCA. 本站著作權受美國千禧年法案保護。