macOS System-Level Input Source Switching¶
整理目前在 macOS 上管理 input source 切換的幾種常見方案,重點是:
- 不依賴 Rime / Squirrel 內建的
app_options或vim_mode - 直接操作 macOS 的 input source layer
- 回答兩個實際問題:
- 能不能維持「全局一致」?
- 能不能做到「特定 app 預設輸入法」?
查閱日期:2026-03-31
TL;DR¶
Apple 原生能做到什麼¶
Apple 官方目前明確文件化的原生能力主要是:
- 顯示 input menu
- 用
Caps Lock在 non-Latin 與「last used Latin input source」間切換 - 用
Fn/Globe或快捷鍵切換 input source - 記住「每個文件」的 input source
最重要的原生選項在:
System Settings > Keyboard > Text Input > Edit > Automatically switch to a document's input source
Apple 的描述是:同一個文件在關閉前,會記住自己的 input source。
所以如果目標是「盡量全局一致」,通常應先把這個選項關掉。
Apple 原生做不到什麼¶
我沒有找到 Apple 官方文件化的「per-app 預設輸入法」功能。這裡的結論是根據目前 Apple 文件可見內容做的推論,不是 Apple 明文說「絕對不支援」。
換句話說:
全局一致: Apple 原生可部分改善特定 app 預設: 目前看不到 Apple 原生正式支援
方案總覽¶
| 方案 | 操作層級 | 全局一致 | per-app 預設 | 備註 |
|---|---|---|---|---|
| Apple 原生設定 | 系統內建 | 部分可行 | 不明顯支援 | 先關閉 per-document 記憶 |
| Input Source Pro | 系統層 app 規則 | 可 | 可 | 成品最完整 |
| Hammerspoon | 系統層自動化 | 可 | 可 | 開源,可自訂規則 |
| Keyboard Maestro / BetterTouchTool | 系統層自動化 | 可 | 可 | 適合已有自動化棧的人 |
macism |
CLI backend | 不是完整方案 | 可被上層調用 | 適合搭 Hammerspoon / KM / BTT |
im-select |
CLI backend | 不是完整方案 | 可被上層調用 | macOS 上對 CJK 切換可靠性較弱 |
| Karabiner-Elements | 快捷鍵 / 改鍵 | 不擅長 | 不擅長 | 官方直接提醒 CJKV 可能失敗 |
1. Apple 原生設定¶
參考:
Apple 目前明確列出的相關選項有:
Show Input menu in menu barUse the Caps Lock key to switch to and from [last used Latin input source]Automatically switch to a document's input sourceFn/Globekey 切換 input source
適合的用法¶
如果目標是減少狀態混亂,先做這兩件事:
- 關掉
Automatically switch to a document's input source - 開啟 menu bar input menu,保留可見性
能力邊界¶
- 可改善「切文件之後狀態突然不同」的情況
- 不能直接表達「Terminal 一律 ABC、WeChat 一律注音」這種 app rule
所以原生設定比較像是:
- 收斂全局行為
- 但不是 app-aware rule engine
2. Input Source Pro¶
參考:
這是目前最接近「現成可用 app 規則系統」的方案。
官網明列能力:
- 根據 app 自動切換 input source
- 根據網站自動切換 input source
- 顯示目前 input source
- 在 IDE / Terminal 類 app 強制英文標點
截至 2026-01-18 的 2.9.0 changelog 也還在持續改善 switching logic consistency。
優點¶
- 成品完整,不需要自己寫 watcher
- 明確支援 per-app 預設
- 還有可見性與標點規則
缺點¶
- 不是系統內建
- 如果你想把規則版本化進 dotfiles,不如 Hammerspoon 直觀
適合誰¶
- 想最快得到「app 切換時自動切輸入法」
- 不想自己維護 Lua / AppleScript / shell glue
3. Hammerspoon¶
參考:
Hammerspoon 是最適合做「自己掌控規則,但又保持在 macOS input source layer」的開源方案。
官方現成 Spoon InputSourceSwitch 已直接支援:
- 切 app 時自動切換 input source
範例就是:
hs.loadSpoon("InputSourceSwitch")
spoon.InputSourceSwitch:setApplications({
["WeChat"] = "Pinyin - Simplified",
["Mail"] = "ABC",
})
spoon.InputSourceSwitch:start()
如果不想只靠 Spoon,也可以自己用 hs.keycodes.currentSourceID([sourceID]) 讀寫目前的 input source,自己綁 app watcher 或 window watcher。
優點¶
- 開源
- 規則可版本控制
- 可以做得很細,例如:
- app activated 時切換
- 只對某些視窗標題切換
- 額外加 menubar / alert 指示
缺點¶
- 要自己維護設定
- 如果底層切換本身遇到 macOS/CJK 問題,仍可能需要更可靠的 CLI backend
4. Keyboard Maestro / BetterTouchTool¶
參考:
- Keyboard Maestro Application Trigger
- Keyboard Maestro Execute a Shell Script
- BetterTouchTool Global and App-Specific Triggers
這兩者都不是專用 input source 工具,但都能做出「app activated -> 執行 script -> 切輸入法」的流程。
Keyboard Maestro¶
Keyboard Maestro 官方文件明確支援:
- application activates / deactivates trigger
- Execute a Shell Script action
所以可以做:
- App Activate Trigger
- 呼叫
macism或其他 CLI - 切到指定 input source
BetterTouchTool¶
BetterTouchTool 官方文件明確支援:
- global triggers
- app-specific triggers
- conditional activation groups
它本身不是專門的 input source 切換器,但如果你本來就有 BTT,自動化入口已經足夠,只差底層切換命令。
什麼時候選這條路¶
- 你本來就在用 KM / BTT
- 想把輸入法切換跟其他 workspace automation 合併
- 不想再引入一套新的整體框架
5. CLI backend:macism 與 im-select¶
這兩個通常不是完整解法,而是給上層工具調用的切換 backend。
macism¶
參考:
macism README 的核心主張是:
- 它比
im-select等類似工具更可靠地切換 CJKV input source - 其他工具有時會出現 menu bar icon 已變,但實際輸入來源沒真的切過去的情況
這個專案也直接提供:
- 取得目前 input source
- 設定指定 input source
- 內建 workaround for the macOS bug
如果你要自己用 Hammerspoon / Keyboard Maestro / BetterTouchTool 拼裝,我會優先考慮 macism。
im-select¶
參考:
im-select 是常見方案,很多 Vim / VSCodeVim 設定都支援它。
但如果你的核心場景是:
- 中文 / 日文 / 韓文 / 越南文等 CJKV input source
- 要求切換後立即可靠生效
那目前資料更偏向:
im-select可用- 但 macOS 上 CJK 切換可靠性通常不如
macism
6. Karabiner-Elements¶
參考:
Karabiner 很適合做:
- 快捷鍵綁定
- 依 input source 條件改鍵
- 送出切換快捷鍵
但不適合當這題的主方案。
Karabiner 官方文件直接提醒:
- 對有
input_mode_id的輸入法,例如 CJKV,select_input_source可能因 macOS 問題失敗 - 對 CJKV,官方甚至建議送出 input source switch shortcut,例如
control-space
所以它比較適合:
- 做 hotkey
- 做狀態條件
- 當輔助層
而不是當主要的 per-app input source manager。
推薦路線¶
路線 A:最少折騰¶
適合先驗證問題是不是主要來自 macOS 的 per-document 行為。
- 關掉
Automatically switch to a document's input source - 保留 menu bar input menu 或其他 indicator
- 先觀察是否已經大幅減少混亂
路線 B:想要每個 app 自動切到指定輸入法¶
首選:
- Input Source Pro
原因:
- 這是目前最完整的成品
- 有 app rules
- 有 indicator
- 有 terminal / IDE 標點類附加功能
路線 C:想要開源、可版本控制、可放進 dotfiles¶
首選:
- Hammerspoon +
macism
原因:
- Hammerspoon 負責 watcher / 規則
macism負責較可靠的底層切換- 最適合 repo 化與長期維護
路線 D:你本來就重度使用 KM / BTT¶
首選:
- Keyboard Maestro / BetterTouchTool +
macism
原因:
- 不需要再多引入一套自動化邏輯
- 直接掛在既有 app activate trigger 上
與 Rime / Squirrel 的關係¶
這些方案的共同點是:
- 目標是從 macOS input source layer 管理切換
- 不依賴 Squirrel 的
app_options或vim_mode
因此比較適合處理:
- app 切換時想要固定英文 / 固定中文
- 想降低「現在到底是什麼輸入狀態」的不確定感
但要注意:
- 如果底層 macOS 對某些 CJK input source 本身就有切換 bug,任何方案都可能只是在不同程度上繞過它
- 所以實務上,
system automation layer + visible indicator往往比只追求「自動切換」更穩
References¶
- Apple Support: Change Input Sources settings on Mac
- Input Source Pro
- Input Source Pro Changelog
- runjuu/InputSourcePro
- Hammerspoon InputSourceSwitch Spoon
- Hammerspoon hs.keycodes
- laishulu/macism
- daipeihust/im-select
- Karabiner-Elements: to.select_input_source
- Keyboard Maestro: Application Trigger
- Keyboard Maestro: Execute a Shell Script
- BetterTouchTool: Global and App-Specific Triggers