IBus

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

## 目标

IBus 的主要目标如下：

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

## 开发动机

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

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

## 系统架构

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 模组。

## 特点

- 输入法引擎可以随时载入与卸载
- Systray 支援
- XKB 支援
- 配置选项更动可即时生效。
- 提供 C 与 Python 的界面

## 现有输入法引擎列表

- ibus-anthy: 日文输入法。
- ibus-array: 行列输入法
- ibus-bopomofo: 使用注音符号的拼音输入法，基于ibus-pinyin引擎开发，但输入方式与一般标准智慧形注音输入法（如新酷音输入法或微软新注音）不同。
- 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 之类的复杂选字算法，只需要一个对照表即可运作。许多字形输入法像是仓颉输入法及五笔输入法都由 ibus-table 所支援。

<image>

官方释出的码表:

- latex: 使用 latex 语法来输入特殊符号，ibus-table 自带
- compose: 使用 compose letter 及 diacritical mark 来输入特殊字元，ibus-table 自带。
- Array30: 行列30输入法。
- Cangjie: 仓颉及速成、三代及五代。
- Erbi: 二笔输入法。
- Wubi: 五笔输入法。
- Yong: 永码输入法。
- ZhengMa: 郑码输入法。

1.可选字由预设的1页6个换成主流的1页9个寻找 `_page_size = 6` 修改为

```python
        _page_size = 9
```

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

```python
        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
```

换成

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

3.backspace键 跳上一页选字寻找

```python
        elif key.code == keysyms.BackSpace:
```

将下面的

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

取代为

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

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

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

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

```python
        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在系统高负载时输入时有卡住的现象。
- 当用户在火狐浏览器文本框输入文字并希望选中文字时，文字将会自动删除。

## 参阅

- 输入法
- Unix输入法列表
- SCIM
- uim
- Fcitx

## 参考资料

- Linux进化特区：Ubuntu 12.04 从入门到精通

## 外部链接

- IBus 首页
- IBus Git 源码
- Comparison of Chinese Input Method Servers for Unix-like Operating Systems

## 基本资料

- 开发者：黄鹏
- 发行日期：2008年8月10日
- 软件版本周期：1.5.27
- 编程语言：C, Python
- 操作系统：Unix-like
- 语言：多语
- 状态：支援中
- 类型：输入法
- 许可协议：GNU宽通用公共许可证 v2
- 网站： IBus 专案页面