在 Windows 上使用小麥注音輸入法

zonble
5 min readMar 10, 2024

--

今年上半年度個人在 side project 上的主要心力,大概就是把小麥注音輸入法移植到 Windows 系統上。對我來說,相當於在幾個主要的作業系統上,都有我慣用的中文輸入法,也都比較能夠發揮生產力。

小麥注音是一套從 macOS 系統上開始發展的注音輸入法,在 2022 年的時候,因為幾個朋友平常工作用的機器也不侷限在 macOS 上,所以也開始把自己慣用的輸入工具移植到其他平台上,包括基於 fcitx5 框架的 Linux 版本,而我自己出於好玩,把原本的程式改用 TypeScript/JavaScript 寫了一次,而做出了 Chrome OS 版本,我當時把一台舊 PC 裝上了 Chrome OS Flex,我在那台機器上,也有了順手的輸入法了。

那時候也大概看到了一個技術上的可能 — Windows 上有一套叫做 PIME 的輸入法框架,在這個框架上,可以用 Python、或是可以用 Node 執行的 JavaScript 的輸入法,既然小麥有一個以 TypeScript/JavaScript 寫成的版本,那就有透過 PIME 移植到 Windows 的可能。既然技術上可行,後面就是資源的問題了,人到中年能夠用在工作與家庭以外,還能投入到其他出於興趣的專案上的時間實在不多,大概是在過年期間,才有時間看一下 PIME 的程式,然後讓小麥的程式在 PIME 上面動了起來。

安裝步驟

目前做到的,大概就是可以自己手動編譯安裝,然後可以在各種應用程式中打字,像這篇文章,就是用小麥的 PIME 版本打出來的,我自己也用了 Windows 7、8、10、11 的虛擬機大概測試一下,都可以使用。如果對這個版本有興趣,可以參考以下步驟。(您可能會需要一些 git 工具以及 Node.js 等前端開發工具的經驗)

  1. 首先安裝 PIME 1.3 版本,也就是最新版
  2. 用 git clone 命令,clone 一份 McBopomofoWeb 的程式
  3. 電腦上要安裝 Node.js,以及 npm 或 yarn 等命令
  4. 執行 npm install,以及 npm run build:pime
  5. 把 output/pime 目錄複製到 C:\Program Files (x86)\PIME\node\input_methods\mcbopomofo 目錄下
  6. 用系統管理員權限,執行一次 regsvr32 “C:\Program Files (X86)\PIME\x86\PIMETextService.dll”,這個命令是讓 PIME 載入各種用 Python/JavaScript 寫成的輸入法

做完這些步驟,照理說就可以開始切換到小麥注音打字。不過有時候一安裝完畢,會發生 PIME 似乎無法啟用 Node server 然後卡死的狀況,我也不太清楚是怎麼造成的。而雖然自認可用,目前也還沒力氣去弄一個安裝程式出來,做個 Windows 安裝程式還得考慮 code sign 等等安全問題,而要做 code sign 還得去買個憑證什麼的…目前實在沒什麼力氣做這些。

PIME 小麥注音與 Chrome OS 版本的差別

雖然 PIME 版本與 Chrome OS 版本的小麥注音,都是用 TypeScript/JavaScript 寫的,而組字引擎、詞庫、按鍵處理以及狀態機設計等,都使用同一份程式碼,但還是有一些居別。最大的差異在於,Chrome OS 的輸入法是 Chrome 瀏覽器的 extension,PIME 則是在 Node 上運作,也就是說,其實兩者分別是 Browser 與 Node server 執行的 JavaScript,那在使用 webpack 打包的時候,就得設定成不同的 target,選錯了 target 就會無法執行。

而在輸入、輸出以及儲存格式方面,也不太一樣:

輸入:我們在 Chrome OS 上收到的鍵盤事件,是屬於瀏覽器世界的 Keyboard Event,這種事件會直接在名稱上顯示出特定的名稱,像是按了 Shift 就會告訴你 key 是 “Shift”,至於 PIME 則會將 Windows 定義的 keycode 包裝一層送過來,兩者的格式不太一樣。不過,小麥注音內部又定義了一個自己的按鍵物件的格式,在處理兩個平台不同的按鍵事件時,都是先經過翻譯,再送進內部處理。

輸出:在 Chrome OS 上,我們可以直接操作 chrome.input.ime 下定義的 UI 物件,包括輸入緩衝區、選字窗等等,但是 PIME 則是定義成:當一個按鍵被按下時,會對輸入法送一個 request,然後輸入法做完所有該做的處理之後,再送一個 response 回應給 PIME 平台,所有的 UI 變化,都得包含在這個 request 中,也就是說,輸入法需要先暫存這一輪的所有 UI 改動,再統一回覆出去。所以,對小麥輸入法來說,也得對怎麼更新 UI 做一輪抽象化,然後對 Chrome OS 與 PIME 分開實作。

儲存:Chrome OS 的輸入法本身是個 extension,而每個 extension 其實有一個儲存資料的空間,存進這個空間之後,還可以直接在所有裝了 Chrome 的電腦之間同步,所以輸入法可以、也只能,把像是偏好設定以及自訂詞等等,存在這個空間裡。至於在 Windows 上面使用 Node,就可以直接存取磁碟上面的檔案了。

其他就是像是呈現輸入法選單、按鈕這些 UI 的差別,但這些差異說實在也沒多大。而看來熟悉了一些 TypeScript/JavaScript 之後,除了可以用來做網站前後端之外,至少也可以拿來一次做兩個平台的輸入法,雖然一直以來 Chromebook 在台灣都不普及,但是把一些舊機器拿來裝上 Chrome OS Flex,當做簡單的上網機或是打字機,也是很不錯的。

--

--