讓新注音在輸入英文字時自動切換輸入法
編輯中文文件時,為了輸入英文術語或是標記符號得頻繁點選 Shift 切換輸入法。是否有方法能減輕切換輸入法的麻煩,提升新注音輸入法的使用體驗?
除了頻繁按 Shift 這行為本身以外,另一個麻煩是忘記切回輸入法會增加刪字的負擔。因此,減輕切換輸入法負擔的方向有幾個:降低切換輸入法的頻率、減少忘記切換輸入法的困難、降低切換輸入法的負擔。
在這篇文章中,我將介紹目前有哪些解決問題的途徑或專案,讓新注音自動切換輸入法有哪些潛在困難,以及我自己的嘗試。
新注音內建的智慧切換
最理想的情況是讓輸入法的切換由電腦代勞,在 win11 系統其實內建了智慧切換功能,它的原理是判斷鍵入字串的內容與順序,假設輸入的注音字串無法對應到任何中文字,則會自動印出輸入的英文字串。(好比說,若輸入ㄇㄇㄇㄇ,因為中文沒有這種字彙組合,輸入法便會印出 aaaa)
然而,即使是中文母語使用者,也常發生打錯字或打錯聲母韻母順序的狀況。在預設條件下,ime 會擋住錯誤的指令,也會自動排序聲母與韻母的位置。在開啟智慧切換功能後,輸入法會變得相當敏感,稍有錯字便會被判定為英文字串並印出。
換句話說,這項功能僅有限地降低切換輸入法的頻率,卻大幅限制了用戶輸入中文的方式,還徒增不少刪字的負擔。
voidism 的自動切換輸入法程式
鑒於新注音內建方案的缺陷,voidism 開發的自動切換輸入法程式 則是採取另一項策略。這套軟體只有在鍵入內容吻合英文字庫收錄的字串時,才會將內容轉為英文字串輸出,因此維持了注音輸入的容錯率,又能達到自動切換輸入法的效果。
另一方面,這工具也能自動轉換符合中文字的注音字串,所以即使點選Shift後忘記切回中文輸入法,也不會面臨一長串令人崩潰的字串要刪除。
讀了程式的字庫後了解,voidism 這套軟體有兩組字庫,其一是得自 linux 系統的完整單字庫,另一部分是長度為三個字元的短字串字庫,紀錄了所有無法轉換為中文的英文字串。第二種方法的好處在於不須無止盡地擴充字庫大小,只是因為部分英文字串與與中文字的注音字串重碼,例如up與一ㄢ的按鍵相同,而過短的介係詞或縮寫無法支援。1
重新映射快捷鍵
由於是否輸入英文取決於用戶,因此另一種策略是不動用輸入法本身的判斷,而是減輕用戶切換輸入法的負擔。例如google 拼音中文輸入法就有類似的功能,分別用空白鍵和 Enter 作為英文和中文的輸出訊號,因為輸入英文通常伴隨空白鍵,而輸入中文則伴隨選字的 Enter。
這方法看似與純靠 Shift 一樣都需要頻繁按按鍵,但因為與語言和原先的操作習慣相符,所以能減輕使用的負擔,也因為由用戶自行判斷中英文輸入,可以簡化很多程式判斷或字庫建立的功能。
然而,這套做法在注音輸入窒礙難行的原因是,注音需要輸入音調,而空白鍵既作為音調又作為空格,以至於無法靠空白鍵判斷是否要輸入英文還是中文。若改用其他鍵,那效果就不會有在空白鍵那麼自然了。
區域辨識輸入法
假設英文字的使用範圍相當明確,例如 latex 或 markdown 的程式碼片段或數學公式列,這些區域一定只有英文與符號,所以也能辨識這些區域來轉換輸入法。例如 YF-Zhao 開發的Shift-IM-for-Math即專為頻繁的數學公式輸入設計,當套件識別段落中的$$
(數學式標記符號)時會自動切換輸入法。
這功能對於具特殊標記的場合相當友善,但不易應對中英混雜的狀況。
以音調鍵區分中英文輸入
另外一種想法則是,利用音調鍵區分中英文輸入,舉例來說,「早(yl3)安(0 ),吃(t )飽(1l3)沒(ao6),中文字對應的注音字串必定以音調鍵作結,所以可以透過音調鍵的有無區分當前輸入的是中文還是英文。 這方法不用建立字庫,但因為聲調鍵與數字和空白鍵重疊,所以應用範圍僅限於英文字母。
我嘗試也實作了能自動切換輸入法的工具。網址位於,https://github.com/5uperb0y/bopomofo-ahk,因為目前功能都還在開發中,所以各項功能仍不太穩定。
我使用的工具是 autohotkey v2,因為主程式小,環境依賴也比較單純,匯出的檔案可以直接包成可執行檔。
想法如下:
1 | while key & len < 4: |
這算法有幾個重要的環節需要判斷,首先要確認當下用戶正在打字,而且正在使用新注音輸入法的中文模式。
接著,紀錄每次輸入的按鍵,由於注音字串最長四個字元,所以用四個字元一循環判斷當前輸入的單字,假設碰到聲調符號,則匯出中文字;假設四個字元都沒有輸出聲調符號,則判定為英文字。由於部分英文單字較短,所以添加 Enter 作為 break,讓用戶自行判斷現在輸入的是英文字。
這規則雖然免去建立字庫的工作,但因為音調鍵分別與空白鍵和數字鍵重疊,所以採用這策略時,只能打英文字母,不能打數字。不然就得建立新的規則去判斷何時適用轉換規則。
另一個困難是,如何判定當前正在打字視窗的輸入法狀態?windows 的 api 在這方面的支援很混亂,雖然現今輸入法宣稱改用 tsf 架構,但仍能使用傳統 ime 的 api 呼叫。
有時甚至無法在打字視窗呼叫之,目前我找到的一段程式碼還不是很穩定。先前也有使用螢幕截圖,判斷輸入法位置的圖樣來判斷是否為指定輸入法,然而每個作業環境都不一樣,每次調整設定都要更新設置。
另一個問題是空白鍵,空白鍵既為注音的音調鍵、中英文共通的空格鍵,對於一些單字要怎麼判斷是在進行分隔符,還是還是判斷聲調仍是個大問題。
結案
輸入法相關開發經調查還真小眾,算是少數 stakeoverflow 找不到令人滿意見解的題材,許多開發者的努力都是在精進中英文切換的困擾、符號輸入的便捷性、智慧選字或建立辭庫的方案。
在我執行這個專案後過了一年左右,華碩推出他們的 中英混合輸入法,使用體驗比本文提及的方式都良好,軟體也更加穩定。
然而,提及的限制仍然存在。空白鍵的多重定位還是讓開發者頭痛,所以華碩他們也是讓用戶按 Enter 決定是否要終止英文輸入,畢竟這是最吻合中文輸入時習慣的方式。另一方面,軟體很難得知你是打錯字還是真的想拼寫英文,所以打字速度飆起來的時候,輸入次序就會干擾混合輸入法的判斷
也許中文本身的特性就跟現代電腦開發有些不一樣,我很期待 ai 輸入法能帶我們走到何處。如果往後存在一個在我們反應過來之前,替用戶做決定的輸入方式應該不意外。
延伸資料
- 神器AutoHotKey帮助我们在MarkDown编辑中文内容快乐地输入英文标点
- 如何解决用markdown写中文文章时需要不断切换中英文输入法的问题?
- 汉字输入法还能更进一步吗?
- 1.另一個使用上較不便的地方是需要手動更改輸入法判斷的位置依據,但 win11 已經有 api 可以調用,所以可能讓這套工具更加完善。↩