Linux有三个主要的输入法( IME=input method editor )接口。
- XIM ( X Input Method)
- GTK IM module
- QT IM module
有三种使用比较广泛的的输入法框架,下面是他们的区别:
框架 | | 通信原理 |
XIM (X Input Method) | 协议简单、通用,所有X应用都支持。严重问题:同步阻塞。应用必须等待输入法服务器响应,容易导致UI卡顿。 | 基于X11协议扩展。应用程序(客户端)和输入法(服务器)通过X窗口系统直接通信,使用特定的X事件和属性。 |
IBus (Intelligent Input Bus) | 解决了XIM卡顿问题。功能丰富,支持复杂的预编辑文本和控件。曾是GNOME桌面默认框架。 | 基于D-Bus总线。应用和输入法都连接到D-Bus上,通过总线发送和接收消息。这是“客户端-服务端-总线”模型。 |
Fcitx (Flexible Input Method Framework) | 灵活、高效、轻量。兼容性好,能无缝接管老程序。在KDE等社区中非常流行。 | 混合架构。核心使用D-Bus进行通信(类似IBus),同时兼容XIM协议以支持老程序。设计更模块化。 |
核心演进路线:XIM(同步阻塞) -> IBus/Fcitx(基于D-Bus的异步)。
输入法整理工作原理大致相同,下面是 IBus 输入法的架构图。
第一套:使用 xim 作为桥梁(过渡/兼容模式),会让你在所有应用中都退回旧的XIM模式。
export XMODIFIERS=@im=fcitx # 告诉X11应用,通过XIM协议去找名为"fcitx"的服务器export GTK_IM_MODULE=xim # 告诉GTK应用,使用内部的xim模块去连接export QT_IM_MODULE=xim # 告诉Qt应用,使用内部的xim模块去连接export SDL_IM_MODULE=xim # SDL2export XIM=xim # SDL1
- 逻辑:应用 -> GTK/QT的
xim模块 ->XIM协议-> Fcitx(以XIM服务器身份运行)。 - 本质:所有通信都降级到了旧的XIM协议,即使后端是Fcitx,也无法享受D-Bus带来的异步和非阻塞优势。这通常是为了解决某些老软件兼容性的临时方案,不是最佳实践。
export XMODIFIERS=@im=ibus export GTK_IM_MODULE=ibus export QT_IM_MODULE=ibus export SDL_IM_MODULE=ibus export XIM=ibus
- 逻辑:应用 -> GTK/QT的
ibus 模块 -> D-Bus -> IBus 输入法服务。
export XMODIFIERS=@im=fcitxexport GTK_IM_MODULE=fcitx export QT_IM_MODULE=fcitx export SDL_IM_MODULE=fcitxexport XIM=fcitx
- 逻辑:应用 -> GTK/QT的
fcitx 模块 -> D-Bus -> Fcitx 输入法服务。 - 本质:应用通过各自工具集的原生输入法模块,直接与Fcitx的D-Bus服务通信。这是性能最佳、功能最全的方式,应该作为标准配置。
桌面系统使用im-config包中的im-config命令配置默认输入法框架。启动时通过 /etc/X11/Xsession.d/70im-config_launch 脚本读取下面两个文件(定义在 xinputrc.common 文件中)的输入法变量来决定启动哪个输入法框架服务的(启动命令使用包中自定义的 rc 文件,不使用 /etc/X11/xinit/xinput.d 目录中的文件),但是启动后,会被fcitx.desktop自启覆盖。
# 检查im-config配置(某些系统使用)$ im-config -l # 列出当前配置$ im-config -m # 显示当前激活的框架# 手动切换框架,保存到 /etc/X11/xinit/xinputrc$ im-config # 设置框架(会弹出图形界面)
服务器主要是使用imsettings包中 imsettings-switch命令行工具配置默认输入法框架。当然也有图形化的 im-chooser,需要手动安装。启动时通过imsettings-start.desktop在自启动时根据下面两个文件的输入法变量实现来决定启动哪个输入法框架服务的。
- $HOME/.config/imsettings/xinputrc
$ imsettings-list* 1: FCITX[fcitx.conf] (recommended) 2: X compose table[xcompose.conf] 3: im-cedilla[im-cedilla.conf] # 立即切换,并保存到 $HOME/.config/imsettings/xinputrc$ imsettings-switch "X compose table"Switched input method to X compose table$ imsettings-list 1: FCITX[fcitx.conf] (recommended)* 2: X compose table[xcompose.conf] 3: im-cedilla[im-cedilla.conf]
Fcitx 是一个支持扩展的输入法框架,它使用不同的映射系统为应用程序提供输入不同字符的接口。具有直观的图形配置工具和可自定义的外观和映射表。高度模块化和可扩展性,使用 GTK+ 2/3 和 Qt IM 模块支持基于 Fbterm、Xlib、GTK+ 或 KDE 的程序,以及开发人员友好的 API 。
用户的配置文件所在的目录主要有:
Fcitx 安装、扩展和配置相关目录如下:
$ fcitx4-config --packagefcitx$ fcitx4-config --prefix/usr$ fcitx4-config --exec-prefix/usr$ fcitx4-config --includedir/usr/include$ fcitx4-config --addondir/usr/lib/x86_64-linux-gnu/fcitx$ fcitx4-config --addonconfigdir/usr/share/fcitx/addon$ fcitx4-config --imconfigdir/usr/share/fcitx/inputmethod$ fcitx4-config --configdescdir/usr/share/fcitx/configdesc
一般来说,输入法也是 Fcitx 中的一种插件,但为了让事情更清楚,我们把它和插件分开。您可以使用 Category:Addon 浏览Fcitx的插件,并按照安装输入法中所述的类似方式安装它们。Fcitx 已经有一些内置插件,你可以用 Category:Built-in Addon 来浏览它,并使用它们。下面是输入法插件的文件结构。
[fcitx install prefix]|- share/fcitx5| |- addons/[addon name].conf| |- inputmethod/[input method name 1].conf #输入法插件| |- inputmethod/[input method name n].conf #输入法插件||- lib/fcitx5 |- [library name].so
以上是输入法插件的文件结构。对于其他类型的插件,不需要 inputmethod/ 下的文件。[addon name].conf 的文件名很重要,将用于唯一引用此特定插件。Fcitx 也遵循 XDG 目录标准,所以 XDG_DATA_DIR/fcitx5 下的文件也会被检查。同样,inputmethod/下的配置文件的文件名也很重要,将是某个输入法的唯一名称。
[插件名称].conf 示例
[Addon]Name[zh_CN]=拼音Name=PinyinCategory=InputMethodVersion=5.0.8Library=pinyinType=SharedLibraryOnDemand=TrueConfigurable=True[Addon/Dependencies]0=punctuation[Addon/OptionalDependencies]0=fullwidth1=quickphrase2=cloudpinyin3=notifications4=spell5=pinyinhelper6=chttrans7=imeapi
[输入法名称].conf示例
[InputMethod]Name[ca]=PinyinName[da]=PinyinName[de]=PinyinName[he]=פיניין:Name[ko]=병음Name[ru]=ПиньиньName[zh_CN]=拼音Name=PinyinIcon=fcitx-pinyinLabel=拼LangCode=zh_CNAddon=pinyinConfigurable=True
该文件采用类似 ini 的格式,具有某些 fcitx 特定的扩展名和规则。它还支持 XDG 桌面文件样式 i18n 进行翻译。
项目的框架如下。
├── CMakeLists.txt├── LICENSES│ └── BSD-3-Clause.txt # License for this project├── po # Optional I18n│ ├── CMakeLists.txt│ ├── fcitx5-quwei.pot│ ├── LINGUAS│ └── zh_CN.po└── src ├── CMakeLists.txt ├── quwei-addon.conf.in.in # Addon 注册文件 ├── quwei.conf.in # Input method 注册文件 ├── quwei.cpp # Engine implementation └── quwei.h # Engine implementation
quwei.conf.in 内容如下,此文件将作为 InputMethodEntry 对象进行加载。
[InputMethod]# Translatable name of the input methodName=Quwei# Icon nameIcon=fcitx-quwei# A short label that present the name of input methodLabel=区# ISO 639 language codeLangCode=zh_CN# Match addon nameAddon=quwei# Whether this input method support customization# Configurable=True
quwei-addon.conf.in 内容如下
[Addon]Name=QuweiCategory=InputMethodVersion=@PROJECT_VERSION@Library=quweiType=SharedLibraryOnDemand=TrueConfigurable=True[Addon/Dependencies]0=punctuation[Addon/OptionalDependencies]0=fullwidth1=quickphrase2=chttrans
一个输入法会安装如下文件。
-- Install configuration: "Debug"-- Installing: /usr/lib/fcitx5/quwei.so-- Installing: /usr/share/fcitx5/addon/quwei.conf-- Installing: /usr/share/fcitx5/inputmethod/quwei.conf
右键托盘区域的输入法图标 -> 选择『配置』,或者命令行执行 fcitx-configtool ,进入 Fcitx 输入法配置界面如下。


可以添加、删除输入法,设置输入的顺序,设置输入法的切换快捷键等。
搜狗输入法sogouimebs包,安装后会有如下两个服务会在开机时自动启动。在 /opt/sogouimebs/files/bin/目录下有一些工具:
sogouimebs-diag 这命令会输出系统相关日志。sogouIme-configtool 是搜狗输入的配置面板。
用户的配置文件所在的目录主要有:
root@zhuang-pc:~# dpkg -L sogouimebs # 1.可执行文件/opt/sogouimebs/files/bin/SogouVoiceControl/opt/sogouimebs/files/bin/sogouimebs-session/opt/sogouimebs/files/bin/SogouHandInput/opt/sogouimebs/files/bin/sogouimebs-diag/opt/sogouimebs/files/bin/sogouImeService/opt/sogouimebs/files/bin/SogouUpdater/opt/sogouimebs/files/bin/sogouImeService-watchdog/opt/sogouimebs/files/bin/sogou_auto_input_text.sh/opt/sogouimebs/files/bin/sogouIme-configtool/opt/sogouimebs/files/bin/SogouCrashFileUpLoad# 2. fcitx 插件/usr/lib/x86_64-linux-gnu/fcitx/fcitx-sogouimebs.so/usr/lib/x86_64-linux-gnu/fcitx/fcitx-sogouimebshdm.so/usr/lib/x86_64-linux-gnu/fcitx/fcitx-sogouimebshxm.so# 3. fcitx 输入法注册文件/usr/share/fcitx/inputmethod/sogouimebs.conf# 4. fcitx 插件注册文件/usr/share/fcitx/addon/fcitx-sogouimebs.conf/usr/share/fcitx/addon/fcitx-sogouimebshxm.conf/usr/share/fcitx/addon/fcitx-sogouimebshdm.conf# 5. 自启动文件/etc/xdg/autostart/sogouImeService.desktop/etc/xdg/autostart/sogouImeService-watchdog.desktop
环境变量指引应用程序加载对应的客户端通信库,这个库再去寻找对应的服务名称来建立连接。
关键点补充:
1. 模块加载:GTK_IM_MODULE=fcitx 告诉GTK去加载 im-fcitx.so 这样的动态库,这个库实现了GTK与Fcitx通信的客户端逻辑。2. 协议选择:如果应用是极老的纯X11应用(如某些Java程序),它不理会GTK/QT设置,只认 XMODIFIERS,这时Fcitx会以XIM服务器身份与之通信,作为兜底。3. 服务发现:D-Bus连接通常通过服务名(如 org.fcitx.Fcitx)来建立。2.2.1. 第一步:根据环境变量加载库 (客户端模块) 当应用程序(比如一个GTK写的gedit)启动时:
- GTK/Qt 初始化会读取
GTK/QT_IM_MODULE 环境变量。假设值是 fcitx。 - GTK/Qt 会在预定义的目录中,查找一个名为
im-fcitx.so 的动态库文件,并加载它。
- GTK:
/usr/lib64/gtk-3.0/3.0.0/immodules/ 或 /usr/lib/$(arch)-linux-gnu/gtk-3.0/3.0.0/immodules/ - QT:
${QT_PLUGIN_PATH}/platforminputcontexts/和${QT_DIR}/plugins/platforminputcontexts/
关键点:GTK/QT_IM_MODULE=fcitx 中的 fcitx,直接对应着动态库文件名 im-fcitx.so 和 libfcitxplatforminputcontextplugin.so。
加载了正确的客户端库之后,这个库就知道该用什么协议、去哪里找真正的输入法服务了。这里有两条路径:
1. 路径A:fcitx / ibus 专用模块 -> D-Bus服务名
im-fcitx.so 或 im-ibus.so 这类专用模块内部硬编码或约定好了要连接的D-Bus服务名。
- Fcitx的服务名通常是 org.fcitx.Fcitx
- IBus的服务名是 org.freedesktop.IBus
模块加载后,会直接通过D-Bus去查找这个确切的服务名来建立连接。
2. 路径B:xim 通用模块 -> XIM服务器名
如果你设置 GTK_IM_MODULE=xim,那么加载的就是 im-xim.so。这个通用模块的行为不同:
- 从
XMODIFIERS=@im=fcitx 中解析出服务器名 fcitx。 - 然后使用古老的X11协议,在X窗口系统中去查找注册了这个名字的XIM服务器(可能是Fcitx或IBus以兼容模式运行的XIM前端)。
环境变量 | 库文件 | 最终连接方式 |
GTK/QT_IM_MODULE=fcitx
| im-fcitx.so、
libfcitxplatforminputcontextplugin.so
| 库内嵌逻辑 -> D-Bus服务名 (org.fcitx.Fcitx) |
GTK/QT_IM_MODULE=ibus
| im-ibus.so、libibusplatforminputcontextplugin.so
| 库内嵌逻辑 -> D-Bus服务名 (org.freedesktop.IBus) |
GTK/QT_IM_MODULE=xim
| 库文件im-xim.so | 读取 XMODIFIERS 变量 -> X11协议 |
XMODIFIERS=@im=fcitx
| XIM服务器名称 | X11协议 (仅被xim模块或老式X应用使用) |
图形库 | 输入法库的路径 |
GTK | /usr/lib64/gtk-3.0/3.0.0/immodules/ (R系统)
/usr/lib/$(arch)-linux-gnu/gtk-3.0/3.0.0/immodules/(U系统)
|
Qt | /usr/lib64/qt5/plugins/platforminputcontexts/(R系统)
/usr/lib/$(arch)-linux-gnu/qt5/plugins/platforminputcontexts/(U系统)
|
XIM | /usr/lib64/fcitx/fcitx-xim.so(R系统)
/usr/lib/$(arch)-linux-gnu/fcitx/(U系统)
|
$dpkg -l|grep fcitxfcitx-frontend-all => 空包,依赖 fcitx-frontend-gtk2, fcitx-frontend-gtk3, fcitx-frontend-qt5fcitx-frontend-gtk2 => /usr/lib/aarch64-linux-gnu/gtk-2.0/2.10.0/immodules/im-fcitx.sofcitx-frontend-gtk3 => /usr/lib/aarch64-linux-gnu/gtk-3.0/3.0.0/immodules/im-fcitx.sofcitx-frontend-qt5 => /usr/lib/aarch64-linux-gnu/qt5/plugins/platforminputcontexts/libfcitxplatforminputcontextplugin.sofcitx-module-x11 => X11 模块和XIM前端:/usr/lib/aarch64-linux-gnu/fcitx/fcitx-xim.so 等$rpm -qa|grep fcitxfcitx-gtk2 => /usr/lib64/gtk-2.0/2.10.0/immodules/im-fcitx.sofcitx-gtk3 => /usr/lib64/gtk-3.0/3.0.0/immodules/im-fcitx.sofcitx-qt5 => /usr/lib64/qt5/plugins/platforminputcontexts/libfcitxplatforminputcontextplugin.sofcitx-libs => /usr/lib64/fcitx/fcitx-xim.so 等
当输入法不工作时,你可以按以下步骤诊断:
# 查看进程$ ps aux | grep -E "(fcitx|ibus-daemon)"/usr/bin/fcitx -d$ ps aux | grep sogouIme/opt/sogouimebs/files/bin/sogouImeService/opt/sogouimebs/files/bin/sogouImeService-watchdog# 查看D-Bus服务 (更准确)dbus-send --session --type=method_call --print-reply --dest=org.freedesktop.DBus \ /org/freedesktop/DBus org.freedesktop.DBus.ListNames | grep -i fcitx# 或使用 busctl (systemd 系统)busctl --user list | grep -i fcitx
每个 Fcitx 进程启动一个 DBus 服务,如 org.fcitx.Fcitx、org.fcitx.Fcitx-10。其中 org.fcitx.Fcitx-*和DISPLAY相关,如。
org.fcitx.Fcitx-0 是 DISPLAY=:0 和对应(默认)。
org.fcitx.Fcitx-10 是 DISPLAY=:10.0 和对应。
当有多个桌面会话,必须要启动多个对应的 org.fcitx.Fcitx-* DBUS 服务。也就是需要启动多个 fcitx 进程。
如果服务未启动,尝试手动启动
# 启动Fcitx并后台运行fcitx -dr & nohup /opt/sogouimebs/files/bin/sogouImeService &nohup /opt/sogouimebs/files/bin/sogouImeService-watchdog &# 启动Ibus 并后台运行ibus-daemon -drx &
执行下面的命令,查看 GTK 和 Qt 的输入法 IM 模块,如果没有说明系统文件缺失,需要从正常的机器拷贝过来
# 查看GTK2/3已安装的输入法模块$ find /usr/lib* -name "im-*.so"/usr/lib64/gtk-2.0/2.10.0/immodules/im-fcitx.so (R系)/usr/lib/aarch64-linux-gnu/gtk-2.0/2.10.0/immodules/im-fcitx.so (U系)# 查询GTK的IM模块注册表 (会列出所有已发现和可用的模块)$ find /usr/lib* -name "immodules.cache" -exec grep "im-fcitx" {} \;"/usr/lib64/gtk-2.0/2.10.0/immodules/im-fcitx.so" (R系)"/usr/lib64/gtk-3.0/3.0.0/immodules/im-fcitx.so" (R系)"/usr/lib/aarch64-linux-gnu/gtk-2.0/2.10.0/immodules/im-fcitx.so" (U系)"/usr/lib/aarch64-linux-gnu/gtk-3.0/3.0.0/immodules/im-fcitx.so" (U系)# 对于Qt5,模块通常在插件目录$ find /usr/lib* -name "platforminputcontexts" -exec sh -c "ls {}/*" \;/usr/lib64/qt5/plugins/platforminputcontexts/libcomposeplatforminputcontextplugin.so (R系)/usr/lib64/qt5/plugins/platforminputcontexts/libfcitxplatforminputcontextplugin.so (R系)/usr/lib64/qt5/plugins/platforminputcontexts/libibusplatforminputcontextplugin.so (R系)/usr/lib/aarch64-linux-gnu/qt5/plugins/platforminputcontexts/libcomposeplatforminputcontextplugin.so (U系)/usr/lib/aarch64-linux-gnu/qt5/plugins/platforminputcontexts/libfcitxplatforminputcontextplugin.so (U系)/usr/lib/aarch64-linux-gnu/qt5/plugins/platforminputcontexts/libibusplatforminputcontextplugin.so (U系)
# 在终端里打印,或在应用启动脚本里添加$ env |grep IM_MODULEGTK_IM_MODULE=fcitxQT4_IM_MODULE=fcitxCLUTTER_IM_MODULE=fcitxQT_IM_MODULE=fcitx
如果没有输入法的环境变量,可以指定输入法后执行,测试输入法能否正常使用
# 以不同的IM模块启动应用,观察效果GTK_IM_MODULE=xim geditGTK_IM_MODULE=ibus geditGTK_IM_MODULE=fcitx gedit
也可以对运行的软件,执行下面的命令检查输入模块是否被加载
# 启动一个gedit,然后查看它加载了哪些so库lsof -p `pidof gedit` 2>/dev/null | grep -E "im-.*\.so"# 或者使用 strace 跟踪库加载strace -e openat gedit 2>&1 | grep “im-”
从 4.2.7 开始,Fcitx 提供了一个 fcitx-diagnose 的命令,它可以检测一些常见的问题并且给出一些建议。
# fcitx 提供的诊断工具,默认输出大终端$ fcitx-diagnose > fcitx.log# 搜狗输入法会在当前目录生成日志文件$ /opt/sogouimebs/files/bin/sogouimebs-diagsogouimebs-diag_20260128T121958.tar.xz
有些问题是搜狗输入版本导致的,但是在没有升级包的情况下,可以做如下处理。
rm -rf ~/.config/SogouPY* ~/.config/sogou* ~/.sogou*
有些自己装的 Qt 开发库,内置没有 fcitx 输入法模块,需要自己编译。如果与系统的 Qt 版本差别不大,也可以直接把系统中的 libfcitxplatforminputcontextplugin.so拷贝到 ${QT_DIR}/plugins/platforminputcontexts/目录下。下面介绍一下编译的方法:
从 https://github.com/fcitx/fcitx-qt5.git 下载 5-1.2.4 版本,编译
# 服务器系统$ sudo yum install cmake extra-cmake-modules \ libxkbcommon-devel fcitx-qt5-devel \ fcitx-devel# 桌面系统和V4服务器$ sudo apt install cmake extra-cmake-modules \ libxkbcommon-dev libfcitx-qt5-dev \ fcitx-libs-dev $ git clone https://github.com/fcitx/fcitx-qt5.git$ cd fcitx-qt5$ cmake -DCMAKE_PREFIX_PATH=/opt/Qt5.9.3/5.9.3/gcc_64/lib \ -DQt5_DIR=/opt/Qt5.9.3/5.9.3/gcc_64/lib/cmake/Qt5 ..$ make
将libfcitxplatforminputcontextplugin.so库拷贝至/opt/Qt5.9.3/5.9.3/gcc_64/plugins/platforminputcontexts和/opt/Qt5.9.3/Tools/QtCreator/lib/Qt/plugins/platforminputcontexts目录下。
有些程序需要在登录界面启动,并且需要输入法,可以参考下面的实现,主要LANG="zh_CN.UTF-8" 语言的配置。
1、/etc/lightdm/lightdm.conf 里增加session-setup-script=/opt/secplatform/bin/fcitx.sh2、程序运行前先运行一个fcitx.sh脚本,内容如下#!/bin/bashexport GTK_IM_MODULE=fcitxexport XMODIFIERS=@im=fcitxexport QT_IM_MODULE=fcitxexport QT4_IM_MODULE=fcitxexport CLUTTER_IM_MODULE=fcitxfcitx -d sleep 2export LANG="zh_CN.UTF-8"/opt/sogouimebs/files/bin/sogouImeService &这里执行自己的程序kill -9 `pidof fcitx`kill -9 `pidof ukui-notification`
默认的 vncserver 的回话启动脚本可能没有启动输入法,可以参考下面的修改,加入fcitx -d 和 GTK/QT_IM_MODULE、XMODIFIERS环境变量。
# cat ~/.vnc/xstartup#!/bin/shexport XKL_XMODMAP_DISABLE=1unset SESSION_MANAGERunset DBUS_SESSION_BUS_ADDRESSexport GTK_IM_MODULE=fcitxexport XMODIFIERS=@im=fcitxexport QT_IM_MODULE=fcitx[ -x /etc/vnc/xstartup ] && exec /etc/vnc/xstartup[ -r $HOME/.Xresources ] && xrdb $HOME/.Xresourcesxsetroot -solid greyvncconfig -iconic &ukui-session &fcitx -d
V4 系统进入桌面后,发现有[fcitx] 僵尸进程。可以通过在/etc/profile 中增加如下代码解决。
export GTK_IM_MODULE=fcitxexport XMODIFIERS=@im=fcitxexport QT_IM_MODULE=fcitx
V4 VNC桌面与物理显示器的桌面同时登录时出现“输入法的候选框在两个桌面上来回飘”,输入的字符只在当前桌面上出现一半,另一半显示在另一个桌面上。需要更新下面两个包:
还需要把 /etc/xdg/autostartup/sogouimeservice.desktop 删掉,不然VNC的桌面会起两个该程序,导致输入有问题。同时在 vncserver 的启动脚本中添加 fctix -d & 和搜狗的服务启动。
https://fcitx-im.org/wiki/FAQ/zh-hans
https://wiki.archlinuxcn.org/wiki/输入法
https://wiki.archlinuxcn.org/wiki/Fcitx
https://wiki.archlinuxcn.org/wiki/IBus
https://fcitx-im.org/wiki/Fcitx_5/zh-cn