Skip to content

Input Methods

以 macOS 為主,記錄這個 dotfiles repo 目前使用與追蹤的繁體中文輸入法相關資訊,重點放在:

  • McBopomofo
  • Rime / Squirrel
  • app 切換時的輸入法狀態
  • vim_mode、ascii_mode、全局狀態等已知限制
  • 哪些檔案適合備份,哪些不適合直接納入 chezmoi

本文內容以目前這台機器的實際狀態為基準整理,並補上 upstream 文件與 issue / PR 連結。

  • macOS System-Level Input Source Switching: 不依賴 Rime / Squirrel 內建切換時,Apple 原生、Input Source Pro、Hammerspoon、Keyboard Maestro / BetterTouchTool、macism、im-select、Karabiner 等方案的比較

本機已驗證的路徑與狀態

驗證日期:2026-03-31

Squirrel / Rime

本機已確認存在:

  • ~/Library/Rime/squirrel.custom.yaml
  • ~/Library/Rime/user.yaml
  • ~/Library/Rime/installation.yaml
  • ~/Library/Rime/build/
  • ~/Library/Rime/sync/<installation_id>/

本機目前狀態:

  • Squirrel app 存在於 "/Library/Input Methods/Squirrel.app"
  • Squirrel CFBundleVersion = 1.1.2
  • ~/Library/Rime/installation.yaml 顯示 distribution_version: 1.1.2
  • ~/Library/Rime/installation.yaml 顯示 rime_version: 1.16.0
  • ~/Library/Rime/sync/43cea773-1593-4ccc-a2f3-a852974cbec4/ 已存在,表示目前有啟用 Rime 同步資料夾

McBopomofo

本機已確認存在:

  • ~/Library/Application Support/McBopomofo/data.txt
  • ~/Library/Application Support/McBopomofo/data-plain-bpmf.txt
  • ~/Library/Application Support/McBopomofo/exclude-phrases.txt
  • ~/Library/Application Support/McBopomofo/exclude-phrases-plain-bpmf.txt
  • ~/Library/Application Support/McBopomofo/phrases-replacement.txt
  • ~/Library/Preferences/org.openvanilla.inputmethod.McBopomofo.plist
  • ~/Library/Input Methods/McBopomofo.app

補充:

  • 這台機器的 McBopomofo 是 user-scope app,位於 ~/Library/Input Methods/
  • repo 內目前的 ansible role 只檢查 /Library/Input Methods/;這是獨立 follow-up,本文只記錄,不在這一輪修

Rime / Squirrel 自定義

Rime 的自定義原則是:不要直接改內建 schema 或發行版 yaml,而是使用 *.custom.yaml 搭配 patch: 覆寫。這也是官方 wiki 在 CustomizationGuide 中反覆使用的做法。

macOS 的 Squirrel 對應檔通常是:

  • squirrel.custom.yaml:Squirrel 前端相關設定,例如 style、app_options
  • <schema>.custom.yaml:特定方案的覆寫,例如 bopomofo.custom.yaml
  • default.custom.yaml:全域預設覆寫

一個精簡、代表性的 squirrel.custom.yaml 例子:

patch:
  app_options:
    com.microsoft.VSCode:
      ascii_mode: true
    com.apple.Terminal:
      ascii_mode: true
      no_inline: true
      vim_mode: true
      inline_preedit: false

app_options、ascii_mode、no_inline、vim_mode

  • app_options:針對特定 app 的 bundle identifier 設定行為
  • ascii_mode: true:該 app 預設以西文模式起始
  • no_inline: true:停用行內組字,通常在終端或 editor 更穩定
  • vim_mode: true:目標是讓 Vim 類場景在離開 insert mode 時回到西文狀態,但在 macOS Terminal 類 app 上並不可靠
  • inline_preedit: false:常和 no_inline 一起使用,降低終端內組字與 Esc 互動的干擾

這些選項在 Squirrel 內建的 squirrel.yaml 就能看到預設示例,例如 com.apple.Terminal、com.googlecode.iterm2、org.vim.MacVim。

修改後如何生效

修改 *.custom.yaml 後,需要在 macOS 輸入法選單對鼠鬚管執行「重新佈署」。

根據 Rime wiki 的說法,鼠鬚管是在系統語言文字選單中選擇「重新佈署」;對設置的修改會在重新佈署後生效。

查 app identifier

app_options 需要 bundle identifier。最直接的查法:

osascript -e 'id of app "Visual Studio Code"'
osascript -e 'id of app "Terminal"'

本機已驗證:

  • Visual Studio Code -> com.microsoft.VSCode
  • Terminal -> com.apple.Terminal

如果是第三方 app,也可以先用 Finder 確認正式 app 名稱,再用同樣方式查。

目前最在意的問題

App 切換時輸入法狀態不可靠

目前痛點非常明確:在不同視窗或 app 之間切換後,很難確定當前到底是中文還是英文狀態。

典型情境:

  1. 在某個視窗切成英文
  2. Command+Tab 到下一個視窗
  3. 狀態變成中文
  4. 再切回原本視窗,狀態仍然可能是中文

這不是單靠 app_options 就能完全解決的問題。app_options 比較像是「進入 app 時的偏好」,不是可靠的全局狀態同步機制。

vim_mode 在 Terminal 類 app 上不可靠

截至 2026-03-31,rime/squirrel#1023 仍是 open,問題標題就是「Terminal Vim_mode 無作用」,描述的現象與目前痛點一致:

  • VS Code 可部分工作
  • Terminal 內按 Esc 後不一定能回到西文
  • 導致 h j k l 等按鍵仍進入中文輸入狀態

因此目前比較保守的結論是:

  • vim_mode 可以保留,因為在部分 app 或部分情境仍有幫助
  • 但不要把它當成 Terminal / iTerm / TUI 場景的可靠保證

已知限制與 upstream 狀態

以下狀態都以 2026-03-31 查閱 GitHub 為準。

1. 全局中英狀態目前仍無可靠官方解法

  • rime/home#202 仍為 open。這個 issue 自 2017-12-24 起就在問「全域統一中英切換」。
  • rime/squirrel#145 仍為 open。主題就是「是否有可能将中英文输入状态作全局管理?」
  • rime/librime#294 仍為 open。它把問題提升到 librime 層,直接討論是否要讓所有 client app 共用 global input session / state。

綜合這幾個 issue,可以合理推論目前的限制不只是單一 app 設定問題,而是牽涉到 Squirrel 與 librime 的狀態模型。

2. global_ascii 目前不能當成已正式可用功能

  • rime/squirrel#201 是一個想把 ascii_mode 做成跨 app 全局狀態的舊 PR;截至 2026-03-31 已 closed,未合併
  • rime/squirrel#1054 嘗試用 global_ascii 配置項處理這件事;截至 2026-03-31 也已 closed,且沒有 merged 標記

本機安裝的 Squirrel 1.1.2 內容裡也找不到 global_ascii 關鍵字,因此目前不應把 global_ascii 寫成已可依賴方案。

3. 實務上的結論

目前比較務實的策略是:

  • 用 app_options 管理每個 app 的「偏好初始狀態」
  • 在終端與編輯器場景搭配 no_inline: true
  • 視需要保留 vim_mode: true,但承認它在 Terminal 類 app 上不可靠
  • 如果重點是「可見性」,用額外工具顯示當前輸入法狀態,而不是期待 Rime 已經解決全局同步

狀態可見性工具

ShowyEdge 的定位很清楚:它是 macOS 的「current input source 可視化指示器」。

這類工具的價值在於:

  • 讓你一眼看出現在是 ABC、注音、拼音或其他輸入來源
  • 降低 app / 視窗切換之後的狀態不確定感

但它不是 Rime / Squirrel / librime 的全局狀態修復器。比較準確的期待應該是:

  • 它能改善觀測
  • 不能保證改善切換行為本身

備份策略

這一輪的預設策略是:只備份「手寫設定」與「手動維護內容」,不把所有運行時產物都當成 source of truth。

Rime:建議備份

優先備份:

  • ~/Library/Rime/*.custom.yaml
  • 目前最重要的是 ~/Library/Rime/squirrel.custom.yaml

如果之後開始客製 schema,也一併把這些視為手寫設定:

  • ~/Library/Rime/default.custom.yaml
  • ~/Library/Rime/bopomofo.custom.yaml
  • 其他 <schema>.custom.yaml

Rime:先不要直接納入 chezmoi 的內容

以下檔案不建議直接當成 repo 內主要真相來源:

  • ~/Library/Rime/build/
  • ~/Library/Rime/installation.yaml
  • ~/Library/Rime/user.yaml
  • ~/Library/Rime/*.userdb/

原因:

  • build/ 是重新佈署後的編譯產物
  • installation.yaml 偏向機器與安裝資訊
  • user.yaml 偏向運行狀態與最近使用方案
  • *.userdb/ 是 live user dictionary / frequency data,變動頻繁,直接納管很吵

Rime:sync/ 的定位

~/Library/Rime/sync/<installation_id>/ 應該視為同步或匯出產物,不是主要 source of truth。

它有兩個用途:

  • 跨機同步時,可作為 Rime 自己輸出的可攜資料
  • 在需要救援或搬機時,可作為 userdb 快照與 custom 檔副本

但 repo 策略上,仍建議以手寫的 *.custom.yaml 當主要真相來源,而不是以 sync/ 內容反推設定。

McBopomofo:建議備份

McBopomofo 官方手冊明確提到:

  • 使用者詞彙分頁管理的是純文字檔
  • 這些文字檔位置可以自行決定
  • 甚至可以放到 Google Drive / OneDrive / iCloud Drive 方便備份

以本機目前狀態,建議優先備份:

  • ~/Library/Application Support/McBopomofo/data.txt
  • ~/Library/Application Support/McBopomofo/data-plain-bpmf.txt
  • ~/Library/Application Support/McBopomofo/exclude-phrases.txt
  • ~/Library/Application Support/McBopomofo/exclude-phrases-plain-bpmf.txt
  • ~/Library/Application Support/McBopomofo/phrases-replacement.txt

McBopomofo:可選備份

可選:

  • ~/Library/Preferences/org.openvanilla.inputmethod.McBopomofo.plist

理由:

  • 這裡主要是偏好設定與行為選項
  • 對於詞庫與自訂詞本身不是唯一來源
  • 如果目標是低噪音、可審查、適合版本控制,文字詞庫的優先級更高

已納入 chezmoi 管理(2026-07-29)

Rime 的手寫設定現在由 chezmoi 管理,而且與 Windows repo (daviddwlee84/dotfiles-windows,小狼毫 / Weasel)共用同一份可攜設定。 一樣由 installInputMethod 開關控制;關閉時完全不部署(見 .chezmoiignore.tmpl)。

可攜:兩個 repo 共用,byte-identical

.chezmoitemplates/rime/ 是唯一真相來源,兩個 repo 各存一份完全相同的副本:

檔案 內容
default.custom.yaml schema_list(注音·臺灣正體、注音、朙月拼音、地球拼音、倉頡五代)與 menu/page_size
luna_pinyin.custom.yaml 朙月拼音固定輸出臺灣字形(switches/@2/reset: 3)
bopomofo.custom.yaml 注音選字鍵固定為 ⇧1…⇧0(bopomofo_tw 經 __include 一併繼承)

之所以能共用:Weasel 與 Squirrel 內建的方案集完全相同(都是 plum 的 :preset 套件組 — bopomofo、cangjie、luna-pinyin、terra-pinyin、stroke 等), 所以同一份 schema_list 在三個平台解析結果一致,不需要額外下載方案。

各平台的 renderer 只有一行 {{ template "rime/<檔名>" . }}:

  • macOS(Squirrel)→ private_Library/Rime/*.yaml.tmpl → ~/Library/Rime/
  • Linux(ibus-rime)→ dot_config/ibus/rime/*.yaml.tmpl → ~/.config/ibus/rime/
  • Windows(Weasel)→ AppData/Roaming/Rime/*.yaml.tmpl → %APPDATA%\Rime\

修改流程:改其中一個 repo 的 .chezmoitemplates/rime/,複製到另一個 repo, 再 diff 兩份 — 那個 diff 就是 drift 檢查。

不可攜:各平台自己一份

檔案 平台 為什麼不能共用
private_Library/Rime/squirrel.custom.yaml macOS app_options 以 bundle id 為 key
AppData/Roaming/Rime/weasel.custom.yaml Windows app_options 以 EXE 檔名為 key;style/ 是 Weasel 專屬

一個具體差異:Weasel 支援 global_ascii(全域共用中/英狀態),Squirrel 不支援 — rime/squirrel#201、#1054 都是關閉未合併,本機安裝的 Squirrel 也找不到這個 關鍵字(見上面「已知限制」)。所以 Windows 那份有這個設定、macOS 這份刻意沒有, 這正是兩個檔案必須分開的實際理由。

仍然不納管

build/、installation.yaml、user.yaml、*.userdb/、sync/ 全部維持不納管, 理由同前一節。這點現在是結構性保證而不只是慣例:chezmoi 只管理它自己知道的那幾個 *.custom.yaml,同目錄下的其他檔案不會被碰到。

已驗證 Rime 不會回寫 *.custom.yaml — 切換狀態與最近使用方案是寫進 user.yaml 的 var/option/… 與 var/previously_selected_schema(librime src/rime/switcher.cc 的 Switcher::SetActiveSchema)。所以這些可以是一般 managed file,不需要像 herdr 那樣用 modify_ overlay。

改完設定要重新部署

  • macOS:從輸入法選單選「重新部署」,或 /Library/Input Methods/Squirrel.app/Contents/MacOS/Squirrel --reload
  • Linux:touch ~/.config/ibus/rime/ && ibus restart
  • Windows:chezmoi apply 會自動跑 WeaselDeployer.exe /deploy

Unix 這邊刻意維持手動:Squirrel 的 --reload 不夠可靠,而 ibus restart 會打斷 當前輸入狀態,都不適合塞進 chezmoi apply。

升級 Squirrel 與選字鍵差異

Squirrel 是官方 .pkg 安裝(receipt im.rime.inputmethod.Squirrel,用 pkgutil --pkg-info im.rime.inputmethod.Squirrel 查版本),之後靠內建的 Sparkle 自我更新:輸入法選單 →「檢查更新」。Homebrew 的 squirrel-app cask 裝的是同一個 pkg,但標了 auto_updates,brew upgrade / just upgrade-* 都會跳過它 — 所以不需要改成 brew 管理,記得偶爾檢查更新即可。

注音的選字鍵會隨 Squirrel 內建的 rime-bopomofo 版本改變:

Squirrel rime-bopomofo 選字
1.0.x 2.4 menu/alternative_select_keys: ABCDEFGHIJ → Shift+A…J
1.1.x 3.0 key_binder 把 Shift+!@#…) 送成 KP_1…KP_0 → ⇧1…⇧0

(數字鍵本身是大千式注音鍵,不能直接選字。)bopomofo.custom.yaml 把 3.0 的 ⇧數字綁定附加回去,讓行為不再跟著上游變;但 1.0.x 的 alternative_select_keys 仍會優先,所以兩台機器顯示不同時,先把舊的那台升級。

McBopomofo

McBopomofo 的 *.txt 詞庫與 plist 仍未納管,維持前一節的備份建議即可。

Linux Appendix

這裡只補最小必要資訊,不展開 Linux 端排障。

ibus-rime 配置目錄

根據 Rime wiki,IBus 的使用者資料夾通常是:

  • ~/.config/ibus/rime/

舊版本可能還會看到:

  • ~/.ibus/rime/

ibus-rime 重新部署

根據 Rime wiki 的 CustomizationGuide,如果找不到狀態欄上的 deploy 按鈕,可在終端觸發:

touch ~/.config/ibus/rime/
ibus restart

如果未來這個 repo 要把 Linux 端 Rime 設定一起納管,建議也同樣只從 *.custom.yaml 開始,而不是直接處理整個資料夾。

References