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 支援
支援
配置選項更動可即時生效。
提供 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 專案上遷移過來）

5.1 ibus-m17n

ibus-m17n 利用 m17n 架構下的輸入法及相對應的圖示來達成多語輸入。由於 m17n 架構支援上下文 (surrounding text) 以及輸入狀態 (state)。像是泰文輸入法或是其他需要狀態的輸入法就由 ibus-m17n 來支援。輸入法狀態會顯示在 IBus panel (語言條) 上。

5.2 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 頁 6 個換成主流的 1 頁 9 個

尋找 pagesize = 6

修改為

pagesize = 9

空白鍵跳下一頁選字

尋找 elif key.code == keysyms.space:

將下面的

opy = self.editor.pymode

spres = self.editor.space

return (KeyProcessResult,whethercommit,commitstring)

if sp_res0:

self.commitstring (spres1)

self.addstringlen (sp_res1)

self.db.checkphrase (spres1, sp_res2)

else:

if sp_res1 == u' ':

self.commitstring (condletter_translate (u" "))

if opy != self.editor.pymode:

self.refreshproperties

self.updateui

return True

換成

res = self.editor.pagedown

self.updatelookup_table

return res

3.backspace 鍵 跳上一頁選字

尋找

elif key.code == keysyms.BackSpace:

將下面的

res = self._editor.backspace

self.updateui

取代為

res = self.editor.pageup

self.updatelookup_table

單一個碼空白鍵自動選字，數字鍵區選字

尋找

if key.mask & modifier.RELEASE_MASK:

return True

if self.editor.isempty :

於 return True 與 if self.editor.isempty : 之間

新增

if key.code>=65457 and key.code

缺陷

由於讀取 SQLite 詞庫時有大量的 IO 操作，ibus-pinyin 在系統高負載時輸入時有卡住的現象。
當用戶在火狐瀏覽器文字框輸入文字並希望選中文字時，文字將會自動刪除。

參閱

輸入法
Unix 輸入法列表
SCIM
Fcitx