寫給自然輸入法的使用者

本文對應至少唯音輸入法 4.8.7 版;自然輸入法側以 v13.2.1 為對照基準。

本文提及的自然輸入法版本為所有使用姜天戩菸草注音引擎版本的自然輸入法。截至本文最後一次更新時,已確認至少自然輸入法 v10 & v11 & v12 & v13 使用該引擎(及與此對應的資料架構)。以 v13.2.1 的 App Bundle 為例:內含菸草引擎模組 Modules/OVIMTobacco 與 PhTab/ 對照表,其輸入法本體則是 OpenVanilla 框架的產物。

本文章節(點擊可跳轉;只想趕快把資料搬過去的,請直接看〈怎樣繼承資料〉一節):

自然輸入法的使用者群體往往都攢了十幾年甚至二十幾年的使用者片語儲備量、導致輸入法遷移上的困難。然而,由於自然輸入法是商業產品的緣故,往唯音輸入法內部集成「從自然輸入法遷移資料的功能」這種事情可能不太合適。目前的策略是引導使用者使用單獨的 FOSS 開放原始碼的工具「NCIUserDBKit」析出上述版本的自然輸入法的使用者片語、然後自行決策如何將析出的資料整理使用。

該工具僅讀取使用者自訂詞條(isCustom == 1);與著作權疑慮有關的完整說明,見其倉庫的 README。

唯音 vs 自然輸入法:功能差異

先講一個現實層面的差別:

  • 授權方式:自然輸入法是商業軟體,採帳號授權制(授權跟著帳號走;App 內建線上註冊與「授權管理」)。唯音輸入法則是免費的開源專案(MulanPSLv2;核心引擎為 LGPLv3),沒有帳號授權機制。

以下幾項是功能層面的差異(自然輸入法側以 v13.2.1 為準):

  • 輸入方式:自然輸入法 v13 內建的輸入法包括:注音(標準/許氏/倚天/倚天 26)、漢語拼音、通用拼音、倉頡、簡易(速成),並可用「匯入 .cin」建立自訂輸入法。唯音則提供 11 種注音排列、6 種拼音方案、狂拼模式,以及 CIN 磁帶模式(支援 CIN2 v2.7 標準)。
  • 中英混打:兩邊都有中英模式切換,但在「混打」的自動化設計上取徑不同。
    • 自然輸入法採模式切換:它分成「中文模式」與「英數模式」,可用 Shift 或 Caps Lock 切換(偏好設定內另有「中英切換提醒」,切換中/英模式時會出現提示)。v13 版另提供「智慧中英切換」選項:開啟後不必自己按切換鍵,它會自動切換為英文模式,您輸入空白、任意符號或倒退鍵時再回到中文模式——但它的本質仍是「切換模式」,只是把切換鍵那一步省掉了。「智慧中英切換」與自然輸入法的「英文聯想」(英文單字猜測)互斥:開了前者,後者就沒有作用。
    • 唯音也有中英模式切換:預設左右兩側的 Shift 都能切換中/英數模式(兩側可各自在偏好設定內停用),Caps Lock 與 JIS 鍵盤的英數鍵同樣能切換。在此之上,唯音另有一套中英混打回退:不必切換模式,只要您在注音模式下敲出的按鍵序列不構成任何合法讀音,唯音就把那段內容當成英文如實送出——MacBook、4G、ls 這類內容就是這樣進來的(該回退自 v4.4.1 版起提供,預設關閉,請至「偏好設定 → 行為設定 → 混合輸入」開啟;限注音模式,拼音輸入與 CIN 磁帶模式下不適用。v4.8.3 版起可加開「英數閂滯狀態」,v4.8.4 版起由「依槽序鍵入判定讀音」決定「整段輸入是否為一個讀音」的判定方式)。兩套機制不會互相混淆:一旦切到英數模式,就是純英數輸入、不進入混打判定;而切換中英數模式時,混打的「英數閂滯狀態」也會自動解除。附帶一提,「英數閂滯狀態」本身並不是英數模式——唯音仍處於中文打字模式,只是把混打判定的結果固定住(只作用於英文)。所以說,「切模式」與「不必切模式也能混打」是兩件事:兩邊都有中英模式切換,差別在於混打自動化的取徑不同。
  • 輸出碼:自然輸入法可以把輸出轉成「注音碼/通用拼音碼/漢語拼音碼」,或把輸出轉成簡體字,共 10 種組合可選。唯音沒有這種全時轉換模式,但可用熱鍵把讀音(注音或漢語拼音)或注音標記(括弧註解、HTML Ruby、點字等)遞交出來。
  • 選字窗:兩邊都能調整字級與橫/直式(自然輸入法的偏好設定內有「選字窗樣式」「選字窗字體大小」「特別碼提示」「快打模式」等選項)。唯音的田所選字窗另有多欄矩陣佈局、原生捲動條、Unicode 碼位顯示等特性。
  • 詞語管理:自然輸入法內建「詞語管理」(個人詞庫、文字範本、長句聯想、符號類別排序),支援 CSV 匯入/匯出,以及 IQ 雲端備份/還原(需登入)。唯音內建語彙編輯器(自訂語彙、滷除清單、語彙置換、關聯詞語、繪文字符號),支援就地加詞/刪詞/降頻與自動整理;但沒有雲端功能、也不聯網。
  • 朗讀:自然輸入法可以朗讀您複製的文章(⌥⌘V 開始、⌥⌘S 停止,使用系統中文語音);唯音則可朗讀組音區與候選字詞(v4.1.0 起)。
  • 系統需求:自然輸入法 v13.2.1 支援 macOS 10.15 以上(Universal 二進位:Intel 與 Apple Silicon 皆原生)。唯音主流發行版要求 macOS 12 以上;Aqua 紀念版支援 macOS 10.9 至 12。

怎樣繼承資料

1. 您的資料在哪裡

自然輸入法把使用者資料存放在一個未加密的 SQLite 資料庫內。其位置為:

  • macOS:~/Library/Application Support/GOING{版本號}/UserData/Going{版本號}/profile.db
  • Windows:%appdata%\Going{版本號}\profile.db

其中 {版本號} 的範圍是 10 到 99(實際上主要會用到的是 10 至 13)。例如 v13 就是:

~/Library/Application Support/GOING13/UserData/Going13/profile.db

該資料庫的 profile 資料表結構如下:

欄位 意義
keystrokes 注音讀音,以 - 分隔(例:ㄒㄧㄥ-ㄑㄩㄥˊ-ㄌㄧㄝˋ-ㄔㄜ)
pattern 漢字詞語(例:星穹列車)
hits 使用次數
isCustom 是否為使用者自訂(1 = 自訂)
timestamp 時間戳(用來排序)

2. 用 NCIUserDBKit 把資料倒出來

這套工具是 CLI 工具,需要用 git 工具克隆到您的電腦來使用。

不知道怎麼使用 CLI 工具的話,可以花錢找電腦維修公司的工程師們幫您操作,或者您用 Claude / Gemini / Codex 等 LLM 代勞(但後果自負)。

  • macOS(Swift 版,需 Swift 6.1 或更新版本):在專案倉庫目錄下運行 swift run ncidump dumpall。
  • Windows(C# 版,需 .NET 10 SDK 或更新版本):在專案倉庫目錄內的 WinNT 目錄下運行 dotnet run --project WinNT/NCIUserDBCLI -- dumpall。

兩個版本的工具都提供同樣的子指令:find(只列出找到的資料庫)、dump <資料庫路徑>(只倒出指定的資料庫)、dumpall(把找到的資料庫全部倒出)。

會出現這種終端列印結果(示意):

--- /Users/YourUnixUsername/Library/Application Support/GOING11/UserData/Going11/profile.db ---
=== 使用者自訂詞條 (isCustom == 1, 依 timestamp 排序) ===
共 3 筆
  提供  ㄊㄧˊ-ㄍㄨㄥ  (hits=1, ts=1650506949)
  像是  ㄒㄧㄤˋ-ㄕˋ  (hits=1, ts=1650506953)
  星穹列車  ㄒㄧㄥ-ㄑㄩㄥˊ-ㄌㄧㄝˋ-ㄔㄜ  (hits=1, ts=1771585331)

--- /Users/YourUnixUsername/Library/Application Support/GOING12/UserData/Going12/profile.db ---
=== 使用者自訂詞條 (isCustom == 1, 依 timestamp 排序) ===
共 0 筆

--- /Users/YourUnixUsername/Library/Application Support/GOING13/UserData/Going13/profile.db ---
=== 使用者自訂詞條 (isCustom == 1, 依 timestamp 排序) ===
共 2 筆
  公象  ㄍㄨㄥ-ㄒㄧㄤˋ  (hits=1, ts=1650506935)
  星穹列車  ㄒㄧㄥ-ㄑㄩㄥˊ-ㄌㄧㄝˋ-ㄔㄜ  (hits=1, ts=1771585331)
~/Repos/!vChewing/NCIUserDBKit>

您可以看到第一欄是詞語、第二欄是以 - 銜接的注音讀音串。

該工具不處理由自然輸入法本身匯出的「PersonalPack.gox」私有資料格式(那可能受其著作權保護)。

3. 把倒出來的資料餵給唯音

上述的「詞語 + - 銜接的注音讀音串」組合,可以直接用於唯音輸入法的使用者片語檔案內:

  1. 在唯音的輸入法選單內點「開啟使用者片語辭典目錄」;
  2. 把倒出來的詞條逐行貼進 userdata-cht.txt(若您也用簡體模式,另貼一份進 userdata-chs.txt)。唯音在載入時會自動整理格式。

剩下的 hits(使用次數)與 ts(時間戳)欄位只是輔助資訊,不必搬;唯音的使用者片語檔允許另外用空白字元指定權重(見《使用者片語辭典目錄》)。

$ EOF.