解决 ibus 在 gVim/Emacs 下不能使用的问题 ? Free Mind

来源:百度文库 编辑:神马文学网 时间:2024/04/29 14:09:06

解决 ibus 在 gVim/Emacs 下不能使用的问题

by pluskid, on 2009-06-20, in Tool     12 comments

ibus 是 Linux 下一个比较新的输入法框架,其下的ibus-pinyin 也是比较不错的一个输入法,不过整个项目相对来说还是比较新,所以偶尔也还会有一些小问题,并不是诡异的 bug或者是开发难度上不可行,只是大概还有跟多优先级更高的模块需要处理,比如之前说过的用 Ctrl 切换中英文状态的问题。事实上如果只是自己用的话,做一点小小的 dirty hack 也是非常方便的事情,因为 ibus 是用 Python 写的,直接修改系统中对应的文件即可,甚至都不用重新编译。

如题目所说,今天要解决的问题是 ibus 在 gVim 和 Emacs 下不能使用的问题。先说 Emacs吧,这个似乎是一个老问题了,症状就是在 Emacs 里不能激活输入法,好像从数年前开始就一直都有类似的问题,包括 scim、 fcitx等众多输入法在内都有过类似的问题,似乎是一部分 Gnome 用户会遇到,在 Emacs里无法激活输入法,但是也有另外一些人正常使用,所以后来似乎也没弄明白原因,这里的问题我也不确定是不是同一个,但是症状确实挺像。

事实上,在 en_US 的 locale 下要使用输入法的话,通常需要修改一下 /etc/gtk-2.0/gtk.immodules (不同的发行版该文件的位置可能不太一样),把如下的一行

"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 里还是无法激活,经过在论坛上的讨论,我被告知可以通过把 LC_CTYPE 设置为 zh_CN 才可以在 Emacs 里使用输入法,例如,可以通过如下方式启动 Emacs :

LC_CTYPE=zh_CN.utf8 emacs

至于具体为什么必须要这样才行,我也没有再去深究,毕竟问题得到解决就可以了。

再就是 gVim 里的问题,症状和 Emacs 里不一样,输入法可以激活,但是输入了一两个字母之后输入法立马就被关掉了。目测因该是由于嵌入式编辑和 gVim 起了冲突的缘故。

嵌入式编辑我也不知道用一个什么名字来称呼它好,就是在输入拼音的时候在编辑框内直接填上现在已经确定了的汉字,我最早见到这种输入方式是在微软拼音中,后来 SCIM也支持这种方式,但是由于对它深恶痛绝,从来都是关掉的,因为待输入的文本框可能的样式千奇百怪,输入法并不能完全去适应,既然已经可以在一个输入条中显示出中文了,为什么还要嵌入到编辑框中去呢?如图所示,下面的光标如果在词 english前面想要输入中文,那么嵌入式的预编辑的文本会直接“覆盖”掉单词 english的前半部分,当然这只是显示上的“覆盖”,实际的文本并没有被修改,但是我觉得也是不太友好的,既然没法做好,而且也有在输入条里的很直观的显示,为何还要这么多此一举呢?当然,最关键的问题是它在某些情况下似乎会和 gVim 发生冲突。

说是在某些情况下,是因为我在两个机器上一个可以正常使用一个却不可以,不太确定是不是程序版本的问题,不过我现在可以通过关闭这个叫做 preedit 的东西来解决这个问题。原本因该像 SCIM 那样可以有一个选项选择关闭的,不过 ibus 的选项面板里还没有加入这个选项,于是我就直接暴力地修改一下好了,打开 /usr/share/ibus-pinyin/engine/pinyin.py ,找到 update_preedit 函数的定义:

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 调用注释掉。保存之后在 ibus 的托盘图标那里选择 restart 就可以了。

不过这样的暴力修改也是有一些副作用的,因为 ibus-pinyin 对于不合法的拼音片段并不会在面板上显示出来,比如 i ,关闭 preedit 之后在中文状态下输入 i 看不到任何反馈,不过这几乎不影响使用,而且我觉得这似乎是 ibus-pinyin 在显示的设计上需要修改的地方,对于一些习惯直接输入单词再回车上屏的人估计就不太方便了。

总的来说,ibus-pinyin 还是一个不错的输入法的,希望能好好发展,争取让 Linux 下的输入法不要再和 Windows 下差距那么大。