ibus 是 Linux 下一個比較新的輸入法框架,其下的ibus-pinyin 也是比較不錯的一個輸入法,不過整個項目相對來說還是比較新,所以偶爾也還會有一些小問題,并不是詭異的 bug或者是開發(fā)難度上不可行,只是大概還有跟多優(yōu)先級更高的模塊需要處理,比如之前說過的用 Ctrl 切換中英文狀態(tài)的問題。事實上如果只是自己用的話,做一點小小的 dirty hack 也是非常方便的事情,因為 ibus 是用 Python 寫的,直接修改系統(tǒng)中對應的文件即可,甚至都不用重新編譯。
如題目所說,今天要解決的問題是 ibus 在 gVim 和 Emacs 下不能使用的問題。先說 Emacs吧,這個似乎是一個老問題了,癥狀就是在 Emacs 里不能激活輸入法,好像從數(shù)年前開始就一直都有類似的問題,包括 scim、 fcitx等眾多輸入法在內(nèi)都有過類似的問題,似乎是一部分 Gnome 用戶會遇到,在 Emacs里無法激活輸入法,但是也有另外一些人正常使用,所以后來似乎也沒弄明白原因,這里的問題我也不確定是不是同一個,但是癥狀確實挺像。
事實上,在 en_US
的 locale 下要使用輸入法的話,通常需要修改一下 /etc/gtk-2.0/gtk.immodules
(不同的發(fā)行版該文件的位置可能不太一樣),把如下的一行
"xim" "X Input Method" "gtk20" "/usr/share/locale" "ko:ja:th:zh"
加進去一個 en
變成:
"xim" "X Input Method" "gtk20" "/usr/share/locale" "en:ko:ja:th:zh"
這樣就可以在 en_US
的 locale 下使用輸入法了,不過,在 Emacs 里還是無法激活,經(jīng)過在論壇上的討論,我被告知可以通過把 LC_CTYPE
設置為 zh_CN
才可以在 Emacs 里使用輸入法,例如,可以通過如下方式啟動 Emacs :
LC_CTYPE=zh_CN.utf8 emacs
至于具體為什么必須要這樣才行,我也沒有再去深究,畢竟問題得到解決就可以了。
再就是 gVim 里的問題,癥狀和 Emacs 里不一樣,輸入法可以激活,但是輸入了一兩個字母之后輸入法立馬就被關(guān)掉了。目測因該是由于嵌入式編輯和 gVim 起了沖突的緣故。

說是在某些情況下,是因為我在兩個機器上一個可以正常使用一個卻不可以,不太確定是不是程序版本的問題,不過我現(xiàn)在可以通過關(guān)閉這個叫做 preedit
的東西來解決這個問題。原本因該像 SCIM 那樣可以有一個選項選擇關(guān)閉的,不過 ibus 的選項面板里還沒有加入這個選項,于是我就直接暴力地修改一下好了,打開 /usr/share/ibus-pinyin/engine/pinyin.py
,找到 update_preedit
函數(shù)的定義:
def update_preedit(self, preedit_string, preedit_attrs, cursor_pos, visible):
if preedit_attrs == None:
preedit_attrs = ibus.AttrList()
attr = ibus.AttributeUnderline(ibus.ATTR_UNDERLINE_SINGLE, 0, len(preedit_string))
preedit_attrs.append(attr)
super(PinYinEngine, self).update_preedit_text(ibus.Text(preedit_string, preedit_attrs), cursor_pos, visible)
廢掉它,比如,在第一行加一個 return
或者把最后一行的 super
調(diào)用注釋掉。保存之后在 ibus 的托盤圖標那里選擇 restart 就可以了。
不過這樣的暴力修改也是有一些副作用的,因為 ibus-pinyin 對于不合法的拼音片段并不會在面板上顯示出來,比如 i
,關(guān)閉 preedit 之后在中文狀態(tài)下輸入 i
看不到任何反饋,不過這幾乎不影響使用,而且我覺得這似乎是 ibus-pinyin 在顯示的設計上需要修改的地方,對于一些習慣直接輸入單詞再回車上屏的人估計就不太方便了。
總的來說,ibus-pinyin 還是一個不錯的輸入法的,希望能好好發(fā)展,爭取讓 Linux 下的輸入法不要再和 Windows 下差距那么大。