Karabiner 助力,讓你的鍵盤操作快人一步

語言: CN / TW / HK

Matrix 首頁推薦

Matrix是少數派的寫作社群,我們主張分享真實的產品體驗,有實用價值的經驗與思考。我們會不定期挑選 Matrix 最優質的文章,展示來自使用者的最真實的體驗和觀點。

文章代表作者個人觀點,少數派僅對標題和排版略作修改。

前言

Karabiner 全稱 Karabiner-Elements 1 ,是 macOS 上的一款功能強勁的改鍵工具。它可以將鍵盤上的按鍵對映成其他一個或多個按鍵組合。然而,Karabiner 使用 JSON 作為配置檔案,配置繁瑣且不易理解,給上手帶來了很高的門檻。

於是,有人專門為其製作了一個工具「Goku」,藉助 Goku 可以方便地為 Karabiner 進行配置。

上圖展示了 Karabiner 中與 Goku 中,實現相同效果所需要的寫法差異。

準備工作:

  • Karabiner-Elements 可以從 官網 進行下載
  • Goku 使用 Homebrew 進行安裝: brew install yqrashawn/goku/goku
  • 在 Karabiner 中確保配置檔案 Profiles 選擇預設的 Default
  • 前往  ~/.config/ 目錄,建立名為  karabiner.edn 的 Goku 配置檔案
  • 參考下文進行配置檔案的編輯,每次編輯完後在終端中執行 goku 使修改生效

將 Caps Lock 變為鍵盤功能的中樞

通常,我們將 ⌃Control + ⌥Option + ⇧Shift + ⌘Command 同時按下的組合稱為 Hyper 鍵。通常程式內建的快捷鍵不會預設這麼複雜的組合,因此使用 Hyper 鍵,能最大程度上避免與預設發生衝突。

大寫鎖定鍵 Caps Lock 位於鍵盤左側中間,用起來很順手,但我只用它切換輸入法,輸入大寫字母靠 ⇧shift ,因此這裡先對它下手,你也可以選擇其他順手且不常用的按鍵。

以下的 Goku 配置檔案 karabiner.edn 寫法,可以將大寫鎖定鍵修改為 Hyper 鍵,這時只需要按下這一個鍵,就等同於 ⌃Control + ⌥Option + ⇧Shift + ⌘Command 同時按下的效果。

{
:main [
       {:des "caps_lock -> hyper"
         :rules [
                 [:##caps_lock :!CTOleft_shift]
                 ]}
       ]
}

然而,如果只是將 Caps Lock 轉化為 Hyper 鍵,它會失去本身切換輸入法的效果。幸好 Karabiner 支援在按鍵單獨按下與組合按下時,為觸發不同的效果。

以下寫法可以讓 Caps Lock 與其他鍵一同按下時觸發 Hyper 鍵效果,單獨按下時觸發 Control + Space 切換輸入法。

{
:main [
       {:des "caps_lock -> Ctrl+space(alone) and caps_lock -> hyper"
         :rules [
                 [:##caps_lock :!CTOleft_shift nil {:alone :!Tspacebar}]
                 ]}
       ]
}

以下是一些常用按鍵在 Goku 中的簡化寫法:

;; !  | means mandatory -   modifier(s) alone when pressend change behavior
    ;; #  | means optional  -   modifiers are optional (but at least one necessary)

    ;; :!Ca is keycode :a and prefix a with !C

    ;; C  | left_command
    ;; T  | left_control
    ;; O  | left_option
    ;; S  | left_shift
    ;; F  | fn
    ;; Q  | right_command
    ;; W  | right_control
    ;; E  | right_option
    ;; R  | right_shift

    ;; ## | optional any
    ;; !! | command + control + optional + shift (hyper)

要知道鍵盤上每個按鍵叫什麼名字,可以使用 Karabiner 配套的 Karabiner-EventViewer 進行檢視。

結合 Keyboard Maestro 實現快速搜尋

單靠 Karabiner 只能發揮其一半的功力,要想發揮其全部實力,還是要與 Keyboard Maestro 2 或是 Alfred 這些支援自動化的工具搭檔,才能強強聯合。這裡以 KM 為例,實現快速搜尋選中內容的效果。

在 KM 中建立如下圖的 Macro,為其指定 Hyper + S 的組合鍵,這樣只需要選中想搜尋的內容,按下快捷鍵即可使用 Google 進行搜尋。

同時,藉助 KM 獨特的衝突調色盤功能,當你為多個 Macro 設定了相同快捷鍵,按下快捷鍵後會觸發選擇介面,藉此只需記憶一個快捷鍵,便可觸發多種不同的搜尋功能。

Keyboard Maestro 的衝突調色盤

Hyper + 字母快速切換程式

日常使用時,經常要在不同的應用間來回切換。 Command + Tab 雖然可行,但每次的應用順序不固定,還要找到想切換到的程式,甚至因此誕生了一些專門為切換應用而生的工具。利用 Karabiner 搭配 Keyboard Maestro,即可實現 Hyper + 字母 一鍵切換應用。

在 Keyboard Maestro 中新增 Macro, 選擇 Activate a Specific Application ,配置成下圖所示,便可以在啟用此 Macro 時切換到 Chrome。

這時,如果在 KM 中將 New Trigger 設定為按鍵的 Hyper + C ,就可以開始使用了。

但這畢竟是一篇介紹 Karabiner 的文章,因此我演示一下如何在 Karabiner 的配置檔案中,直接啟用特定的 Macro。

以下配置檔案可以實現 Hyper + C 切換到 Chrome 的效果。

{
:templates {:km "osascript -e 'tell application \"Keyboard Maestro Engine\" to do script \"%s\"'"
            }

:main [
       {:des "caps_lock -> Ctrl+space(alone) and caps_lock -> hyper"
         :rules [
                 [:##caps_lock :!CTOleft_shift nil {:alone :!Tspacebar}]

                 [:!!c [:km "open: chrome"] ] ;;caps+c open Chrome
                 
                 ]}
       ]
}

我在前面模板的基礎上增加了兩部分:

  • 開頭利用 :templates 建立了一個名為 :km 的指令碼,可以快速啟用 KM 中的 Macro
  • :rules 中新增加了一行規則, :!!c 表示 Hyper + C 的組合鍵 3:km "open: chrome" 則表示呼叫前面建立的 km 指令碼,並執行 "open: chrome" 這個 Macro

進階,讓每個鍵都能成為修飾鍵

Hyper 鍵只有一顆,用久了總有鍵位衝突不夠用的那天,比如我既想用 S 鍵觸發 Search,又想用它啟用 Sorted 3。利用層(layer)的概念,可以讓鍵盤上的每個鍵都能成為獨一無二的修飾鍵。

所謂層,可以理解為按下某個鍵後,鍵盤上其他鍵的功能隨之發生變化,例如下圖就是按下 option 鍵後鍵盤的變化,我們可以稱之為「option 層」。

按下 option 後按鍵效果會整體發生變化

如下規則定義了一個稱為「semicolon-mode」的層,在這裡我將使用頻率較低的分號 ; 定義為觸發按鍵:

{
:templates {:km "osascript -e 'tell application \"Keyboard Maestro Engine\" to do script \"%s\"'"
            }

:main [
       {:des "This is the semicolon-mode" 
         :rules [[:semicolon ["semicolon-mode" 1]  nil {:afterup ["semicolon-mode" 0] 
                                                 :alone :semicolon}] 

                [:hyphen [:km "insert: underline"] ["semicolon-mode" 1]]  
        ]}

       ]
}
  • :semicolon ["semicolon-mode" 1] 指按下分號「semicolon」後,將變數 semicolon-mode 設定為 1,即進入「semicolon-mode」層
  • :afterup ["semicolon-mode" 0] 指鬆開分號後,將變數 semicolon-mode 設定為 0,即退出「semicolon-mode」層
  • 單獨按下依然為分號本身 :alone :semicolon

[:hyphen [:km "insert: underline"] ["semicolon-mode" 1]] 這裡,我定義了按下減號 - ,觸發 KM 中名為 "insert: underline" 的 Macro,輸出一個下劃線,這個規則只在 ["semicolon-mode" 1] 時(即按住分號時)才有效。

結語

花一些時間,折騰一點小東西,收穫一個沒多大用的成果,感到巨大的快樂。

這是我對摸魚的定義。摸魚摸得久了,總能折騰出些有意思的東西。現在我每天用這些快捷鍵輸入一些常用短語,切換程式或是快速搜尋,省下的時間可能沒有多少,但是有種莫名的快樂,我覺得這就足夠了。