iBus

多語言輸入框架

Intelligent Input Bus,简称IBus,是 Unix-like 操作系统下的多语输入法平台。因为它采用了总线(Bus)式的架构,所以命名为Bus。

IBus
Intelligent Input Bus (IBus)
Intelligent Input Bus (IBus)
开发者黄鹏
首次发布2008年8月10日 (2008-08-10)
当前版本1.5.27(2022年8月22日,​2年前​(2022-08-22
源代码库 编辑维基数据链接
编程语言C, Python
操作系统Unix-like
语言多语
类型输入法
许可协议GNU宽通用公共许可证 v2
网站IBus 项目页面
IBus
中文输入法
发明人黄鹏
发明年份2008年8月10日
类别拼音

目标

IBus 的主要目标如下:

  • 易用、直觉的全功能输入法用户界面
  • 使用验证方法加强安全性
  • 为输入法开发者提供一个统一的接口函数库
  • 符合来自不同地域,文化的用户需求

开发动机

在东北亚开源软件(OSS)论坛第3工作小组[1]提出的“输入法引擎服务提供者界面规格”(Specification of IM engine Service Provider Interface)草案里[2],能实现以Bus为核心的架构被建议采用。SCIM-1.4 的架构并不被看好,因为它是用C++开发的,因此常常会有C++应用二进制接口不符合的情况发生[3]

从那时起,一些人开始着手开发下一代的输入法平台,像是苏哲领导的IM-Bus,以及胡正的SCIM-2,可惜的是它们的开发进度仍然停滞不前。因此,时任红帽(现任谷歌)的黄鹏开始用Python开发IBus以实现 IM-Bus提出的构想。IBus 并不完全实现东北亚OSS论坛所建议的函数,而是采用D-BusGlib来实做。尽管如此,IBus已经开始被OSS社群所接受,FreeBSD以及各大Linux发行版FedoraUbuntu已经将 IBus 纳入其包库里。在 Fedora 11 里,IBus已经成为默认的多语输入平台[4]

系统架构

IBus 是用 C 及 Python 开发的,如此可以避免 C++ ABI transition 问题。IBus主要透过下列三种服务(Service)来提供功能:

  • 输入法引擎服务:为输入法本身。
  • 配置服务:管理IBus以及输入法的设置选项。
  • 控制面板服务:提供诸如语言条,候选字菜单等用户界面。

IBus 使用D-Bus作 ibus-daemon服务,以及 IM客户端(像是konsole, gedit, firefox)之间的沟通。 ibus-daemon 透过接受服务登录,以及发送D-Bus消息来管理服务及IM客户端。

IBus支持 XIM 协议及 Gtk IM 模块以及 Qt IM 模块。

特点

现有输入法引擎列表

  • ibus-anthy: 日文输入法
  • ibus-array: 行列输入法
  • ibus-bopomofo: 使用注音符号的拼音输入法,基于ibus-pinyin引擎开发[5],但输入方式与一般标准智能形注音输入法(如新酷音输入法或微软新注音)不同。
  • ibus-chewing: 新酷音输入法,智能形注音输入法
  • ibus-hangul: 韩文输入法。
  • ibus-kkc:日文假名汉字转换输入法。
  • ibus-m17n: 使用m17n-db的多语输入法,细节请参阅 #ibus-m17n
  • ibus-pinyin: 拼音输入法,为IBus主要开发者所开发。
  • ibus-libpinyin: 是 Red Hat 工程师主导、基于 n-gram 语言模型的集成性泛拼音输入法引擎。
  • ibus-libzhuyin: 与 ibus-libpinyin 系出同源,支持注音符号输入,名为“新注音”(New Zhuyin) 输入法,是智能形的注音输入法
  • ibus-table: 码表输入引擎,细节请参阅 #ibus-table
  • ibus-googlepinyin: Google拼音输入法的ibus版本(这个并不是官方的Google输入法,而是由爱好者从Android项目上迁移过来)

ibus-m17n

ibus-m17n 利用m17n 架构下的输入法及相对应的图标来达成多语输入。由于m17n架构支持上下文(surrounding text)以及输入状态(state)。像是泰文输入法或是其他需要状态的输入法就由ibus-m17n来支持。输入法状态会显示在 IBus panel (语言条)上。

ibus-table

ibus-table 为余钰炜所开发,针对查表型输入法所设计的码表输入引擎。许多输入法,不需要像是 ibus-chewing 或是 ibus-pinyin 之类的复杂选字算法,只需要一个对照表即可运作[6]。许多字形输入法像是仓颉输入法及五笔输入法都由 ibus-table 所支持。

 
在Ubuntu 12.04.1 LTS使用IBus 1.4.1(仓颉第五代)及其首选项

官方发布的码表[7]:

一些table.py手动修改

1.可选字由默认的1页6个换成主流的1页9个 查找 _page_size = 6 修改为

        _page_size = 9

2.空白键跳下一页选字 查找 elif key.code == keysyms.space: 将下面的

        o_py = self._editor._py_mode
        sp_res = self._editor.space ()
        #return (KeyProcessResult,whethercommit,commitstring)
        if sp_res[0]:
          self.commit_string (sp_res[1])
         #self.add_string_len(sp_res[1])
          self.db.check_phrase (sp_res[1], sp_res[2])
        else:
          if sp_res[1] == u' ':
        self.commit_string (cond_letter_translate (u" "))
        if o_py != self._editor._py_mode:
          self._refresh_properties ()
        self._update_ui ()
        return True

换成

        res = self._editor.page_down()
        self._update_lookup_table ()
        return res

3.backspace键 跳上一页选字

查找
        elif key.code == keysyms.BackSpace:

将下面的

          res = self._editor.backspace ()
          self._update_ui ()

取代为

          res = self._editor.page_up ()
          self._update_lookup_table ()

4.单一个码空白键自动选字,数字键区选字 查找

        if key.mask & modifier.RELEASE_MASK:
          return True
        if self._editor.is_empty ():

return True if self._editor.is_empty (): 之间 新增

        if key.code>=65457 and key.code<=65465 :
          key.code-=65408
        elif key.code == keysyms.space and len(self._editor._chars[0])==1:
          key.code=keysyms._1

缺陷

  • 由于读取SQLite词库时有大量的IO操作,ibus-pinyin在系统高负载时输入时有卡住的现象。
  • 当用户在火狐浏览器文本框输入文字并希望选中文字时,文字将会自动删除[8]

参阅

参考资料

外部链接