在 macOS 上用 CapsLock 切換注音和英語輸入法,應該是很多人的習慣。但不知道你有沒有遇過這種情況:明明按了 CapsLock,輸入法卻沒切換,要再按一次才行。尤其是打字打快一點的時候特別容易發生,非常惱人。
我之前上網查、也問了 AI,得到的建議大多是去「系統設定 > 鍵盤」調整「重複前延遲」或「按鍵重複速率」,但實際試了之後發現效果不大,CapsLock 還是會卡。而且這些設定是全域的,會影響所有按鍵的行為,不能只針對 CapsLock 處理。
後來才發現 macOS 有一個專門針對 CapsLock 延遲的隱藏設定,用 hidutil 一行指令就能解決。
為什麼 CapsLock 會有延遲?
macOS 刻意對 CapsLock 鍵加入了一個短暫的延遲機制。原因是 CapsLock 的位置就在左手小指旁邊,打字的時候很容易不小心碰到,如果沒有延遲的話,一碰就會切換大小寫,對英文使用者來說反而困擾。
所以 Apple 的做法是:快速輕碰 CapsLock 不會觸發,要稍微按久一點才會生效。這對「大小寫切換」的使用情境是合理的,但對我們這種用 CapsLock 切換輸入法的人來說,這個延遲就變成了障礙。
比較可惜的是,Apple 沒有在系統偏好設定中提供關閉這個延遲的選項。
為什麼調「重複前延遲」沒用?
網路上很常看到有人建議去調整鍵盤設定裡的「重複前延遲」,但這其實是不同的東西。「重複前延遲」控制的是按住一個按鍵不放時,要等多久才開始重複輸入,例如按住 a 不放會變成 aaaaaaa,那個等待時間就是「重複前延遲」。
CapsLock 的延遲是另一個獨立的機制,專門用來防止誤觸,跟按鍵重複完全無關。所以不管你怎麼調「重複前延遲」,CapsLock 的延遲都不會改變。
用 hidutil 關閉 CapsLock 延遲
hidutil 是 macOS 內建的 HID(Human Interface Device)裝置設定工具,可以用來調整鍵盤、滑鼠等輸入裝置的行為。其中就包含了 CapsLock 延遲的設定。
打開終端機,輸入以下指令:
hidutil property --set '{"CapsLockDelayOverride":0}'
執行後 CapsLock 的延遲就會立即消失,按下去馬上就能切換輸入法,不需要重新開機。
參數 0 代表完全沒有延遲。如果你不想完全關閉,也可以設定一個較短的延遲值(單位是奈秒),例如 25000000 代表 25 毫秒,但大部分人直接設成 0 就好。
查看目前的設定狀態
如果想確認現在的 CapsLock 延遲設定,可以用以下指令查看:
hidutil property --get "CapsLockDelayOverride"
可能的結果:
- 回傳
0:代表已經關閉延遲 - 回傳一個數字(例如
25000000):代表設定了自訂延遲值(單位是奈秒) - 沒有回傳值或回傳錯誤:代表沒有設定過,使用的是 macOS 預設的延遲
開機自動執行
hidutil 的設定在重開機之後會失效,回到 macOS 預設的延遲行為。如果想讓設定每次開機都自動生效,可以建立一個 LaunchAgent。
建立檔案 ~/Library/LaunchAgents/com.local.capslock-delay.plist,內容如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"
"http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>com.local.capslock-delay</string>
<key>ProgramArguments</key>
<array>
<string>/usr/bin/hidutil</string>
<string>property</string>
<string>--set</string>
<string>{"CapsLockDelayOverride":0}</string>
</array>
<key>RunAtLoad</key>
<true/>
</dict>
</plist>
建立好之後,用以下指令載入:
launchctl load ~/Library/LaunchAgents/com.local.capslock-delay.plist
這樣每次登入 macOS 就會自動執行,不用再手動輸入指令。
恢復預設設定
如果哪天想恢復 macOS 原本的 CapsLock 延遲行為,最簡單的方式就是重開機。或者你可以手動清除設定:
hidutil property --set '{"CapsLockDelayOverride":null}'
如果之前有設定 LaunchAgent,記得也要一起移除:
# 卸載 LaunchAgent
launchctl unload ~/Library/LaunchAgents/com.local.capslock-delay.plist
# 刪除 plist 檔案
rm ~/Library/LaunchAgents/com.local.capslock-delay.plist
這樣就會完全恢復到 macOS 的預設行為了。