Categories

让 ibus pinyin 输入法使用 Ctrl 来切换中英文输入状态

实验室的机器自从升级以后,Xorg 似乎已经可以完全无视 /etc/X11/xorg.conf 的内容配置了,所以我在里面写了交换 Caps Lock 和 Ctrl 也没有任何效果,虽然我可以通过 xmodmap 来做映射,但是这样好像 fcitx 又不认,不能用 ctrl 来切换中英文输入状态了,这个问题我很久很久以前做过 patch ,不过后来 fcitx 的版本似乎有些乱,时而能用时而不能,很诡异。鉴于现在已经完全不像以前那样爱折腾了(在实验室电脑上用了一个完全安装的 Ubuntu 就是一个最好的证明),所以就先忍着。结果这两天 fcitx 干脆连输入状态条都不见了,终于忍无可忍,装了一个 ibus 输入法。

第一感觉是 ibus 输入法还不错!至少在现在 Linux 下的各种输入法当中算很不错的了吧!只是有两个问题:

  1. 打开模糊音之后巨卡,反应及其迟钝,这个我一时也没有办法,对于输入法的算法并不了解,所以只好关掉模糊音,忍一忍了。
  2. 中英文切换是使用 Shift ,并且不可配置。当然,很多人都习惯这个快捷键,不过还有另外很大一部分人(包括我)喜欢用 Ctrl 来切换。搜索了一下发现一个 Issue ,说明确实有不少人需要这个功能,不过作者最近似乎有点忙,一时没法改这个。所以我就决定看看能不能改一下。

把 ibus pinyin 的代码下载回来,看到代码量似乎还是很少的,简单地浏览了一下并用关键字 shiftswitch 等定位了一下,很快就在 engine/pinyin.py 里找到了这一段:

# Match mode switch hotkey
if self.__match_hotkey(key, keysyms.Shift_L, modifier.SHIFT_MASK + modifier.RELEASE_MASK) or \
    self.__match_hotkey(key, keysyms.Shift_R, modifier.SHIFT_MASK + modifier.RELEASE_MASK):
    if self.__candidates and not self.__is_input_english() and PinYinEngine.__shift_select_canidates:
        index = self.__lookup_table.get_current_page_start()
        if key.code == keysyms.Shift_L:
            index += 1
        else:
            index += 2
        result = self.__commit_candidate(index)
        if result:
            if self.__committed_special_phrase:
                self.commit_string(self.__committed_special_phrase)
            else:
                commit_phrases = self.__committed_phrases.get_phrases()
                commit_string = self.__committed_phrases.get_string()
                self.commit_string(commit_string + self.__user_input.get_invalid_string())
 
                # adjust phrase freq and create new phrase
                try:
                    self.__pydb.commit_phrases(commit_phrases)
                    if len(commit_phrases) > 1:
self.__pydb.new_phrase(commit_phrases)
                except:
                    print "Can not inster phrases in db"
        return True
    else:
        self.property_activate("status")
        self.reset()
    return True

虽然 property_activate("status")reset() 似乎跟切换中英文看起来不太相关,但是就这段代码最可疑了。本来还想修改一下定制面板,加一个选项,可以选是用 shift 还是用 control 来切换,但是我发现我对于 ibus 输入法的开发环境配置根本一无所知,特别是修改代码之后怎样在本地跑起一个输入法来?我总不至于改一下代码要测试的时候又把它拷贝到系统目录下去,然后 log out && log in 看看修改效果如何吧?所以想了一下,还是直接最简单地 hack 一下,可以用就行了。于是先找到系统中对应的文件的位置:

$ dpkg -L ibus-pinyin | grep pinyin.py
/usr/share/ibus-pinyin/engine/pinyin.py

然后直接打开,找到之前提到的那一段,在后面加上:

# Make Left Control switch Chinese/English mode
if self.__match_hotkey(key, keysyms.Control_L, modifier.CONTROL_MASK + modifier.RELEASE_MASK):
    self.property_activate("status")
    self.reset()

添加了左边 Ctrl 切换的支持,然后注销、重新登录,果然就 OK 了!有这个需求的朋友可以做类似的修改,包括用右 ctrl 、屏蔽 shift 的中英文切换等。这个 hack 虽然有点 dirty ,但是反正他原来也是硬编码的 shift 切换呢。 :p 不过还是期待作者加入正式的支持,并在 GUI 上加一个选项可供选择。

10 comments to 让 ibus pinyin 输入法使用 Ctrl 来切换中英文输入状态

  • galilette

    $ cat /etc/hal/fdi/policy/dvorak-swapctrl.fdi

    us
    dvorak
    ctrl:swapcaps

  • galilette

    well…
    http://pastebin.com/f32f58905

    <?xml version="1.0" encoding="UTF-8"?>
    <!--
    Section "InputDevice"
       Driver "evdev"
     
       Option "XkbModel" "evdev"
       Option "XkbLayout" "us"
       Option "XkbVariant" "dvorak"
       Option "XkbOptions" "ctrl:swapcaps"
    EndSection
    -->
    <deviceinfo version="0.2">
       <match key="info.capabilities" contains="input.keyboard">
          <merge key="input.x11_options.XkbLayout" type="string">us</merge>
          <merge key="input.x11_options.XkbVariant" type="string">dvorak</merge>
          <merge key="input.x11_options.XkbOptions" type="strlist">ctrl:swapcaps</merge>
       </match>
    </deviceinfo>
  • @galilette
    啊! Thanks! 原来配置改到那里去了啊。不过我把桌面系统切换到 Gnome 之后在它的选项菜单里找到可以改的地方,找了一下,它把修改的选项保存在 ~/.gconf/desktop/gnome/peripherals/keyboard/kbd/%gconf.xml 的:

    <?xml version="1.0"?>
    <gconf>
        <entry name="options" mtime="1242969876" type="list" ltype="string">
            <li type="string">
                <stringvalue>ctrl	ctrl:swapcaps</stringvalue>
            </li>
        </entry>
    </gconf>
  • 司马睿风

    我想问下在ubuntu中哪里可以下载到ruby的源代码呢?编辑器FreeRIDE,有没有lunix系统下的?最近装了ubuntu玩开源

  • 司马睿风

    补充下我找到过一个570KB大小的版本,但是不知道是否是FreeRIDE在lunix下的版本,不大确定

  • @司马睿风
    ruby 源代码在 Ruby 的官方网站就可以下载到,FreeRIDE 不知道,没有用过这个东西呀。

  • 司马睿风

    建议使用下这个编辑器,DEBUG功能不错,好像记得是ruby的一个工程项目来的,不过有2年多没更新了,估计已经完善了

  • @司马睿风
    很奇特的想法,我一般看到两年多没有更新的项目的话,第一反应是它已经死掉了。 ^_^b

  • moneylcj

    你好,在vim设置imactivekey和iminsert选项后,vim依然不能控制ibus,这样在vim中输入中文会很麻烦,博主有什么解决方法吗?谢谢

  • @moneylcj
    恩,我也没法在 gVim 里用 ibus 输入中文,似乎是 ibus 的问题,如果能选择不嵌入的话也许可以。现在我也没有办法,要输入中文的时候只有在终端里用 vim 或者直接用 Emacs 。