通用输入法
Cim 是 Common Input Method(通用输入法) 的缩写。
在 Linux 和 BSD 环境中,输入法体系目前是碎片化的。 应用程序和工具包依赖于不同的标准,例如 XIM、Gtk-IM、Qt-IM 和 Wayland-IM,这使得集成变得复杂且缺乏一致性。
Cim 旨在 统一这些不同的输入法接口。
Cim 并不是将输入法绑定到特定的 GUI 工具包,而是提供一个 独立于工具包的 C API,使应用程序和框架能够以统一的方式访问输入法。
由于 Cim 是一个依赖极少的小型 C 库,因此它可以被用于:
- GUI 工具包
- 终端应用程序
- 控制台程序
- 沙盒环境中的应用程序
- 使用不同编程语言编写的软件
因此 Cim 可以作为 不同环境下文本输入的通用基础设施。
架构
Cim 使用 插件架构(plugin architecture)。
应用程序链接到公共的 Cim API 库:
libcim.so
真正的输入法实现由 插件模块(plugin modules) 提供。
/usr/lib/input.d/im-sample.so
/usr/lib/input.d/im-nimf.so
/usr/lib/input.d/im-ibus.so
/usr/lib/input.d/im-uim.so
/usr/lib/input.d/im-fcitx.so
每个插件都实现了 cim.h 中定义的 Cim 输入上下文 API。
插件可以通过多种方式实现:
-
原生引擎插件 直接实现完整的 IME 引擎
-
框架桥接插件 将 Cim 连接到 ibus 或 fcitx 等现有输入法框架
-
服务型插件 与守护进程或外部服务通信
无论实现方式如何,所有插件都会导出一个名为 cim_plugin 的描述符,其中包含描述输入上下文创建与管理方式的 CimIcVTable。
选择活动插件
当前使用的插件通过以下符号链接选择:
~/.config/cim/plugin
该链接指向所使用的插件模块。
示例:
mkdir -p ~/.config/cim
ln -sf /usr/lib/input.d/im-sample.so ~/.config/cim/plugin
切换到 fcitx:
ln -sf /usr/lib/input.d/im-fcitx.so ~/.config/cim/plugin
这种方式避免依赖环境变量,因为在某些应用程序启动环境中环境变量可能不存在。 同时也更容易实现图形化配置工具。
使用 Cim
配置完成后,应用程序或 GUI 工具包只需要调用 Cim API。
当创建 CimIcHandle(输入上下文)时,libcim.so 会加载选定的插件并将所有操作委托给该插件。
一个插件实例可以创建多个输入上下文,当最后一个上下文销毁时,插件模块会自动卸载。
这种设计既保持了运行时的轻量化,也允许灵活的插件实现。
与现有工具包的集成
即使显示服务器或 GUI 工具包没有原生支持 Cim,也可以通过桥接模块进行集成。
常见环境变量:
QT_IM_MODULE="cim"
GTK_IM_MODULE="cim"
XMODIFIERS="@im=cim"
示例桥接模块:
/usr/local/lib/gtk-4.0/4.0.0/immodules/libim-cim-gtk4.so
/usr/local/lib/gtk-2.0/2.10.0/immodules/im-cim-gtk2.so
/usr/local/lib/gtk-3.0/3.0.0/immodules/im-cim-gtk3.so
/usr/local/lib/qt5/plugins/platforminputcontexts/libqt5im-cim.so
/usr/local/lib/qt6/plugins/platforminputcontexts/libqt6im-cim.so
这些桥接模块允许现有应用程序在无需修改代码的情况下使用 Cim。
基于守护进程的输入系统
某些输入系统,例如 XIM 或 Wayland 输入法,需要进程间通信。
在这些环境中,Cim 可以使用守护进程:
/usr/local/bin/cimd
示例守护进程插件:
/usr/local/lib/cimd/plugins/cim-xim.so
/usr/local/lib/cimd/plugins/cim-wayland.so
这些组件将 XIM 或 Wayland 输入事件转换为 Cim API 调用。
面向输入法开发者的优势
Cim 可以显著降低输入法开发者的集成成本。
传统上,输入法需要分别实现以下模块:
- Gtk-IM
- Qt-IM
- XIM
- Wayland-IM
使用 Cim 后,只需实现一次 Cim 输入上下文 API,即可支持所有这些环境。
另一个重要优势是 低摩擦集成(low-friction integration)。
许多现有 IME 库(如 libhangul、librime、libanthy、libpinyin)已经实现了核心输入逻辑。
在这种情况下,只需通过 CimIcVTable 暴露现有功能的 小型适配层 即可实现 Cim 插件。
如果 upstream 项目没有直接提供 Cim 支持,也可以用相对较少的代码实现 独立的桥接插件。
这种灵活性使 Cim 可以在不进行大规模架构修改的情况下集成到现有输入法生态系统中。
总结
Cim 提供:
- 独立于工具包的输入法 API
- 简单的插件架构
- 低成本集成现有 IME 实现
- 通过桥接模块兼容现有输入法框架
通过将 输入法 API 从 GUI 工具包和显示服务器中解耦,Cim 为 Linux 和 BSD 系统提供了一种更加一致且可移植的文本输入环境。
Cim 技术支持 / 1年
下载
Cim 以源代码形式分发。
cim-2.0.0-2025.12.07.tar.bz2
cim-1.0.0-2024.01.25.tar.bz2
cim-0.0.1-2023.08.02.tar.bz2
cim-0.0-20230610.tar.bz2