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 所支援。

官方釋出的碼表:

- 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 專案頁面