Unix下的中文输入法-Fcitx
小企鹅输入法--Fcitx(Free Chinese Input Toy for X)是一个以GPL方式发布的、基于XIM的简体中文输入法(即原来的G五笔),包括拼音(全拼和双拼)、区位以及码表输入模块,可以输入UTF-8、GBK、GB18030编码中的汉字。是在Linux操作系统中使用的中文输入法,当然BSD下也能在中使用。

其最大的特点是容易安装和使用,无论是拼音还是码表输入都极为强劲,在输入法的自定义使用上也极为灵活。
优点
Fcitx输入响应迅速,配置以及使用较为简单,可以自行替换词库为开源词库以提高输入法效率,提供有码表的转换器,定义快捷键也较为简单。4.0版新加入配置程序、皮肤、SunPinyin集成、以词定字等新特性。
Debian 6 上安装 fcitx-4.x
需要在源中'sources.list'加入后备源。
# apt-get update
# apt-get install fcitx
安装五笔与拼音的table
# apt-get install fcitx-table-wbpy
# apt-get install im-switch
将fcitx设置为默认的输入法
方法一:
# im-switch -s fcitx -z default
或者
# im-switch
在弹出的对话框中选择 fcitx
方法二:
编辑主目录下的'~/.xinitrc',在其中添加:
export GTK_IM_MODULE=fcitx
export XMODIFIERS=@im=fcitx
eval `dbus-launch --sh-syntax --exit-with-session`
exec fcitx
生成配置文件
# fcitx
重置x-window后生效。
从Fcitx聊一下Linux桌面系统中的输入法
本节摘抄自Tech搬运工的博客空间,成文于2026年1月下旬。感谢原作者。
1、输入法框架
Linux有三个主要的输入法( IME=input method editor )接口。
XIM ( X Input Method)
GTK IM module
QT IM module
这是三种使用比较广泛的的输入法框架,其区别如下:
演进路线:XIM(同步阻塞) -> IBus/Fcitx(基于D-Bus的异步)。
输入法整体工作原理大致相同,下为 IBus 输入法的架构图。

1.1 输入法框架环境变量
1. xim
第一套:使用 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 # SDL2
export XIM=xim # SDL1
逻辑:应用 -> GTK/QT的xim模块 ->XIM协议-> Fcitx(以XIM服务器身份运行)。
本质:所有通信都降级到了旧的XIM协议,即使后端是Fcitx,也无法享受D-Bus带来的异步和非阻塞优势。这通常是为了解决某些老软件兼容性的临时方案,不是最佳实践。
2. ibus
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 输入法服务。
3. fcitx
export XMODIFIERS=@im=fcitx
export GTK_IM_MODULE=fcitx
export QT_IM_MODULE=fcitx
export SDL_IM_MODULE=fcitx
export XIM=fcitx
逻辑:应用 -> GTK/QT的 fcitx 模块 -> D-Bus -> Fcitx 输入法服务。
本质:应用通过各自工具集的原生输入法模块,直接与Fcitx的D-Bus服务通信。这是性能最佳、功能最全的方式,应该作为标准配置。
1.2 切换输入法(im-config)
桌面系统使用im-config包中的im-config命令配置默认输入法框架。启动时通过 /etc/X11/Xsession.d/70im-config_launch 脚本读取下面两个文件(定义在 xinputrc.common 文件中)的输入法变量来决定启动哪个输入法框架服务的(启动命令使用包中自定义的 rc 文件,不使用 /etc/X11/xinit/xinput.d 目录中的文件),但是启动后会被fcitx.desktop自启覆盖。
1. $HOME/.xinputrc
2. /etc/X11/xinit/xinputrc
# 检查im-config配置(某些系统使用)
$ im-config -l # 列出当前配置
$ im-config -m # 显示当前激活的框架
# 手动切换框架,保存到 /etc/X11/xinit/xinputrc
$ im-config # 设置框架(会弹出图形界面)
服务器主要是使用imsettings包中 imsettings-switch命令行工具配置默认输入法框架。当然也有图形化的 im-chooser,需要手动安装。启动时通过imsettings-start.desktop在自启动时根据下面两个文件的输入法变量实现来决定启动哪个输入法框架服务的。
3. $HOME/.config/imsettings/xinputrc
4. /etc/X11/xinit/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]
1.3 fcitx 输入法配置
Fcitx是一个支持扩展的输入法框架,它使用不同的映射系统为应用程序提供输入不同字符的接口。具有直观的图形配置工具和可自定义的外观和映射表。高度模块化和可扩展性,使用 GTK+ 2/3 和 Qt IM 模块支持基于 Fbterm、Xlib、GTK+ 或 KDE 的程序,以及开发人员友好的 API。用户的配置文件所在的目录主要有:
~/.config/fcitx
Fcitx 安装、扩展和配置相关目录如下:
$ fcitx4-config --package
fcitx
$ 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
1. Fcitx 的插件
一般来说,输入法也是 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=Pinyin
Category=InputMethod
Version=5.0.8
Library=pinyin
Type=SharedLibrary
OnDemand=True
Configurable=True
[Addon/Dependencies]
0=punctuation
[Addon/OptionalDependencies]
0=fullwidth
1=quickphrase
2=cloudpinyin
3=notifications
4=spell
5=pinyinhelper
6=chttrans
7=imeapi
[输入法名称].conf示例
[InputMethod]
Name[ca]=Pinyin
Name[da]=Pinyin
Name[de]=Pinyin
Name[he]=פיניין:
Name[ko]=병음
Name[ru]=Пиньинь
Name[zh_CN]=拼音
Name=Pinyin
Icon=fcitx-pinyin
Label=拼
LangCode=zh_CN
Addon=pinyin
Configurable=True
该文件采用类似 ini 的格式,具有某些 fcitx 特定的扩展名和规则。它还支持 XDG 桌面文件样式 i18n 进行翻译。
2. 插件示例
项目的框架如下:
├── 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 method
Name=Quwei
# Icon name
Icon=fcitx-quwei
# A short label that present the name of input method
Label=区
# ISO 639 language code
LangCode=zh_CN
# Match addon name
Addon=quwei
# Whether this input method support customization
# Configurable=True
quwei-addon.conf.in 内容如下:
[Addon]
Name=Quwei
Category=InputMethod
Version=@PROJECT_VERSION@
Library=quwei
Type=SharedLibrary
OnDemand=True
Configurable=True
[Addon/Dependencies]
0=punctuation
[Addon/OptionalDependencies]
0=fullwidth
1=quickphrase
2=chttrans
一个输入法会安装如下文件:
-- Install configuration: "Debug"
-- Installing: /usr/lib/fcitx5/quwei.so
-- Installing: /usr/share/fcitx5/addon/quwei.conf
-- Installing: /usr/share/fcitx5/inputmethod/quwei.conf
3. 输入法配置
右键托盘区域的输入法图标 -> 选择『配置』,或者命令行执行 fcitx-configtool ,进入 Fcitx 输入法配置界面;可以添加、删除输入法,设置输入的顺序,设置输入法的切换快捷键等。

2、应用程序调用输入法
环境变量指引应用程序加载对应的客户端通信库,这个库再去寻找对应的服务名称来建立连接。
1. APP与输入法通信

关键点说明:
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)启动时:
1). GTK/Qt 初始化
会读取 GTK/QT_IM_MODULE 环境变量。假设值是 fcitx。
2). 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。
2.2. 第二步:库去连接服务
加载了正确的客户端库之后,这个库就知道该用什么协议、去哪里找真正的输入法服务了。这里有两条路径:
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。这个通用模块的行为不同:
(1). 它会去读取另一个环境变量 XMODIFIERS。
(2). 从 XMODIFIERS=@im=fcitx 中解析出服务器名 fcitx。
(3). 然后使用古老的X11协议,在X窗口系统中去查找注册了这个名字的XIM服务器(可能是Fcitx或IBus以兼容模式运行的XIM前端)。
2.3. 名称和库对照表
2.4. 库路径
2.5. 软件包
两大主流发行版本下的查找方法:
dpkg -l|grep fcitx
rpm -qa|grep fcitx
3、排查技巧
当输入法不工作时可以按以下步骤诊断:
3.1. 检测输入法服务
# 查看进程
$ 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相关,如:
1). org.fcitx.Fcitx-0 是 DISPLAY=:0 和对应(默认)。
2). 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 &
3.2. 检查IM模块
执行下面的命令,查看 GTK 和 Qt 的输入法 IM 模块,如果没有说明系统文件缺失,可从正常的机器拷贝过来(以RedHat与Ubuntu为例)
# 查看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系)
3.3. 检查环境变量是否生效
# 在终端里打印,或在应用启动脚本里添加
$ env |grep IM_MODULE
GTK_IM_MODULE=fcitx
QT4_IM_MODULE=fcitx
CLUTTER_IM_MODULE=fcitx
QT_IM_MODULE=fcitx
如果没有输入法的环境变量,可以指定输入法后执行,测试输入法能否正常使用。
# 以不同的IM模块启动应用,观察效果
GTK_IM_MODULE=xim gedit
GTK_IM_MODULE=ibus gedit
GTK_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-”
3.4. 日志收集
从 v4.2.7 开始,Fcitx 提供了一个 fcitx-diagnose 的命令,它可以检测一些常见的问题并且给出一些建议。
# fcitx 提供的诊断工具,默认输出大终端
$ fcitx-diagnose > fcitx.log
# 搜狗输入法会在当前目录生成日志文件
$ /opt/sogouimebs/files/bin/sogouimebs-diag
sogouimebs-diag_20260128T121958.tar.xz
4、常见问题
4.1. 输入法异常
有些问题是搜狗输入版本导致的,但是在没有升级包的情况下,可以做如下处理。
删除搜狗输入法的配置
rm -rf ~/.config/SogouPY* ~/.config/sogou* ~/.sogou*
重启启动输入法
pkill -f sogou-
fcitx -r
4.2. Qt 输入法用不了
有些自己装的 Qt 开发库,内置没有 fcitx 输入法模块,需要自己编译。如果与系统的 Qt 版本差别不大,也可以直接把系统中的 libfcitxplatforminputcontextplugin.so拷贝到 ${QT_DIR}/plugins/platforminputcontexts/目录下。
4.3. 登录界面启用输入法
有些程序需要在登录界面启动,并且需要输入法,可以参考下面的实现,主要LANG="zh_CN.UTF-8" 语言的配置。
1). /etc/lightdm/lightdm.conf 里增加
session-setup-script=/opt/secplatform/bin/fcitx.sh
2). 程序运行前先运行一个fcitx.sh脚本,内容如下
#!/bin/bash
export GTK_IM_MODULE=fcitx
export XMODIFIERS=@im=fcitx
export QT_IM_MODULE=fcitx
export QT4_IM_MODULE=fcitx
export CLUTTER_IM_MODULE=fcitx
fcitx -d
sleep 2
export LANG="zh_CN.UTF-8"
/opt/sogouimebs/files/bin/sogouImeService &
这里执行自己的程序
kill -9 `pidof fcitx`
kill -9 `pidof ukui-notification`
4.4. VNC 无法输入中文
默认的 vncserver 的回话启动脚本可能没有启动输入法,可以参考下面的修改,加入fcitx -d 和 GTK/QT_IM_MODULE、XMODIFIERS环境变量。
# cat ~/.vnc/xstartup
#!/bin/sh
export XKL_XMODMAP_DISABLE=1
unset SESSION_MANAGER
unset DBUS_SESSION_BUS_ADDRESS
export GTK_IM_MODULE=fcitx
export XMODIFIERS=@im=fcitx
export QT_IM_MODULE=fcitx
[ -x /etc/vnc/xstartup ] && exec /etc/vnc/xstartup
[ -r $HOME/.Xresources ] && xrdb $HOME/.Xresources
xsetroot -solid grey
vncconfig -iconic &
ukui-session &
fcitx -d
4.5. 解决 fcitx 僵尸进程
部分系统进入桌面后,发现有[fcitx] 僵尸进程。可以通过在/etc/profile 中增加如下代码解决。
export GTK_IM_MODULE=fcitx
export XMODIFIERS=@im=fcitx
export QT_IM_MODULE=fcitx
4.6. 输入框来回飘
VNC桌面与物理显示器的桌面同时登录时出现“输入法的候选框在两个桌面上来回飘”,输入的字符只在当前桌面上出现一半,另一半显示在另一个桌面上。需要更新下面两个包:
sogouimebs-3.1.2.5245
libxss1
还需要把 /etc/xdg/autostartup/sogouimeservice.desktop 删掉,不然VNC的桌面会起两个该程序,导致输入有问题。同时在 vncserver 的启动脚本中添加 fctix -d & 和搜狗的服务启动。
最新版本:4.2
* 皮肤支持,采用cairo做绘制,pango负责字体,界面支持真透明;
* 拼音支持多个词库:利用createPYMB创建的词库放在~/.config/fcitx/pinyin下面即可;
* 额外的输入法支持(目前只有fcitx-sunpinyin);
* 基于gtk的图形配置工具fcitx-config(并不包含在fcitx源码包中);
* 右键的菜单支持。
官方主页:http://www.fcitx.org/

其最大的特点是容易安装和使用,无论是拼音还是码表输入都极为强劲,在输入法的自定义使用上也极为灵活。
优点
Fcitx输入响应迅速,配置以及使用较为简单,可以自行替换词库为开源词库以提高输入法效率,提供有码表的转换器,定义快捷键也较为简单。4.0版新加入配置程序、皮肤、SunPinyin集成、以词定字等新特性。
Debian 6 上安装 fcitx-4.x
需要在源中'sources.list'加入后备源。
# apt-get update
# apt-get install fcitx
安装五笔与拼音的table
# apt-get install fcitx-table-wbpy
# apt-get install im-switch
将fcitx设置为默认的输入法
方法一:
# im-switch -s fcitx -z default
或者
# im-switch
在弹出的对话框中选择 fcitx
方法二:
编辑主目录下的'~/.xinitrc',在其中添加:
export GTK_IM_MODULE=fcitx
export XMODIFIERS=@im=fcitx
eval `dbus-launch --sh-syntax --exit-with-session`
exec fcitx
生成配置文件
# fcitx
重置x-window后生效。
从Fcitx聊一下Linux桌面系统中的输入法
本节摘抄自Tech搬运工的博客空间,成文于2026年1月下旬。感谢原作者。
1、输入法框架
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 输入法的架构图。

1.1 输入法框架环境变量
1. xim
第一套:使用 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 # SDL2
export XIM=xim # SDL1
逻辑:应用 -> GTK/QT的xim模块 ->XIM协议-> Fcitx(以XIM服务器身份运行)。
本质:所有通信都降级到了旧的XIM协议,即使后端是Fcitx,也无法享受D-Bus带来的异步和非阻塞优势。这通常是为了解决某些老软件兼容性的临时方案,不是最佳实践。
2. ibus
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 输入法服务。
3. fcitx
export XMODIFIERS=@im=fcitx
export GTK_IM_MODULE=fcitx
export QT_IM_MODULE=fcitx
export SDL_IM_MODULE=fcitx
export XIM=fcitx
逻辑:应用 -> GTK/QT的 fcitx 模块 -> D-Bus -> Fcitx 输入法服务。
本质:应用通过各自工具集的原生输入法模块,直接与Fcitx的D-Bus服务通信。这是性能最佳、功能最全的方式,应该作为标准配置。
1.2 切换输入法(im-config)
桌面系统使用im-config包中的im-config命令配置默认输入法框架。启动时通过 /etc/X11/Xsession.d/70im-config_launch 脚本读取下面两个文件(定义在 xinputrc.common 文件中)的输入法变量来决定启动哪个输入法框架服务的(启动命令使用包中自定义的 rc 文件,不使用 /etc/X11/xinit/xinput.d 目录中的文件),但是启动后会被fcitx.desktop自启覆盖。
1. $HOME/.xinputrc
2. /etc/X11/xinit/xinputrc
# 检查im-config配置(某些系统使用)
$ im-config -l # 列出当前配置
$ im-config -m # 显示当前激活的框架
# 手动切换框架,保存到 /etc/X11/xinit/xinputrc
$ im-config # 设置框架(会弹出图形界面)
服务器主要是使用imsettings包中 imsettings-switch命令行工具配置默认输入法框架。当然也有图形化的 im-chooser,需要手动安装。启动时通过imsettings-start.desktop在自启动时根据下面两个文件的输入法变量实现来决定启动哪个输入法框架服务的。
3. $HOME/.config/imsettings/xinputrc
4. /etc/X11/xinit/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]
1.3 fcitx 输入法配置
Fcitx是一个支持扩展的输入法框架,它使用不同的映射系统为应用程序提供输入不同字符的接口。具有直观的图形配置工具和可自定义的外观和映射表。高度模块化和可扩展性,使用 GTK+ 2/3 和 Qt IM 模块支持基于 Fbterm、Xlib、GTK+ 或 KDE 的程序,以及开发人员友好的 API。用户的配置文件所在的目录主要有:
~/.config/fcitx
Fcitx 安装、扩展和配置相关目录如下:
$ fcitx4-config --package
fcitx
$ 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
1. Fcitx 的插件
一般来说,输入法也是 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=Pinyin
Category=InputMethod
Version=5.0.8
Library=pinyin
Type=SharedLibrary
OnDemand=True
Configurable=True
[Addon/Dependencies]
0=punctuation
[Addon/OptionalDependencies]
0=fullwidth
1=quickphrase
2=cloudpinyin
3=notifications
4=spell
5=pinyinhelper
6=chttrans
7=imeapi
[输入法名称].conf示例
[InputMethod]
Name[ca]=Pinyin
Name[da]=Pinyin
Name[de]=Pinyin
Name[he]=פיניין:
Name[ko]=병음
Name[ru]=Пиньинь
Name[zh_CN]=拼音
Name=Pinyin
Icon=fcitx-pinyin
Label=拼
LangCode=zh_CN
Addon=pinyin
Configurable=True
该文件采用类似 ini 的格式,具有某些 fcitx 特定的扩展名和规则。它还支持 XDG 桌面文件样式 i18n 进行翻译。
2. 插件示例
项目的框架如下:
├── 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 method
Name=Quwei
# Icon name
Icon=fcitx-quwei
# A short label that present the name of input method
Label=区
# ISO 639 language code
LangCode=zh_CN
# Match addon name
Addon=quwei
# Whether this input method support customization
# Configurable=True
quwei-addon.conf.in 内容如下:
[Addon]
Name=Quwei
Category=InputMethod
Version=@PROJECT_VERSION@
Library=quwei
Type=SharedLibrary
OnDemand=True
Configurable=True
[Addon/Dependencies]
0=punctuation
[Addon/OptionalDependencies]
0=fullwidth
1=quickphrase
2=chttrans
一个输入法会安装如下文件:
-- Install configuration: "Debug"
-- Installing: /usr/lib/fcitx5/quwei.so
-- Installing: /usr/share/fcitx5/addon/quwei.conf
-- Installing: /usr/share/fcitx5/inputmethod/quwei.conf
3. 输入法配置
右键托盘区域的输入法图标 -> 选择『配置』,或者命令行执行 fcitx-configtool ,进入 Fcitx 输入法配置界面;可以添加、删除输入法,设置输入的顺序,设置输入法的切换快捷键等。

2、应用程序调用输入法
环境变量指引应用程序加载对应的客户端通信库,这个库再去寻找对应的服务名称来建立连接。
1. APP与输入法通信

关键点说明:
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)启动时:
1). GTK/Qt 初始化
会读取 GTK/QT_IM_MODULE 环境变量。假设值是 fcitx。
2). 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。
2.2. 第二步:库去连接服务
加载了正确的客户端库之后,这个库就知道该用什么协议、去哪里找真正的输入法服务了。这里有两条路径:
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。这个通用模块的行为不同:
(1). 它会去读取另一个环境变量 XMODIFIERS。
(2). 从 XMODIFIERS=@im=fcitx 中解析出服务器名 fcitx。
(3). 然后使用古老的X11协议,在X窗口系统中去查找注册了这个名字的XIM服务器(可能是Fcitx或IBus以兼容模式运行的XIM前端)。
2.3. 名称和库对照表
| 环境变量 | 库文件 | 最终连接方式 |
| 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应用使用) |
2.4. 库路径
| 图形库 | 输入法库的路径 |
| 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系统) |
2.5. 软件包
两大主流发行版本下的查找方法:
dpkg -l|grep fcitx
rpm -qa|grep fcitx
3、排查技巧
当输入法不工作时可以按以下步骤诊断:
3.1. 检测输入法服务
# 查看进程
$ 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相关,如:
1). org.fcitx.Fcitx-0 是 DISPLAY=:0 和对应(默认)。
2). 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 &
3.2. 检查IM模块
执行下面的命令,查看 GTK 和 Qt 的输入法 IM 模块,如果没有说明系统文件缺失,可从正常的机器拷贝过来(以RedHat与Ubuntu为例)
# 查看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系)
3.3. 检查环境变量是否生效
# 在终端里打印,或在应用启动脚本里添加
$ env |grep IM_MODULE
GTK_IM_MODULE=fcitx
QT4_IM_MODULE=fcitx
CLUTTER_IM_MODULE=fcitx
QT_IM_MODULE=fcitx
如果没有输入法的环境变量,可以指定输入法后执行,测试输入法能否正常使用。
# 以不同的IM模块启动应用,观察效果
GTK_IM_MODULE=xim gedit
GTK_IM_MODULE=ibus gedit
GTK_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-”
3.4. 日志收集
从 v4.2.7 开始,Fcitx 提供了一个 fcitx-diagnose 的命令,它可以检测一些常见的问题并且给出一些建议。
# fcitx 提供的诊断工具,默认输出大终端
$ fcitx-diagnose > fcitx.log
# 搜狗输入法会在当前目录生成日志文件
$ /opt/sogouimebs/files/bin/sogouimebs-diag
sogouimebs-diag_20260128T121958.tar.xz
4、常见问题
4.1. 输入法异常
有些问题是搜狗输入版本导致的,但是在没有升级包的情况下,可以做如下处理。
删除搜狗输入法的配置
rm -rf ~/.config/SogouPY* ~/.config/sogou* ~/.sogou*
重启启动输入法
pkill -f sogou-
fcitx -r
4.2. Qt 输入法用不了
有些自己装的 Qt 开发库,内置没有 fcitx 输入法模块,需要自己编译。如果与系统的 Qt 版本差别不大,也可以直接把系统中的 libfcitxplatforminputcontextplugin.so拷贝到 ${QT_DIR}/plugins/platforminputcontexts/目录下。
4.3. 登录界面启用输入法
有些程序需要在登录界面启动,并且需要输入法,可以参考下面的实现,主要LANG="zh_CN.UTF-8" 语言的配置。
1). /etc/lightdm/lightdm.conf 里增加
session-setup-script=/opt/secplatform/bin/fcitx.sh
2). 程序运行前先运行一个fcitx.sh脚本,内容如下
#!/bin/bash
export GTK_IM_MODULE=fcitx
export XMODIFIERS=@im=fcitx
export QT_IM_MODULE=fcitx
export QT4_IM_MODULE=fcitx
export CLUTTER_IM_MODULE=fcitx
fcitx -d
sleep 2
export LANG="zh_CN.UTF-8"
/opt/sogouimebs/files/bin/sogouImeService &
这里执行自己的程序
kill -9 `pidof fcitx`
kill -9 `pidof ukui-notification`
4.4. VNC 无法输入中文
默认的 vncserver 的回话启动脚本可能没有启动输入法,可以参考下面的修改,加入fcitx -d 和 GTK/QT_IM_MODULE、XMODIFIERS环境变量。
# cat ~/.vnc/xstartup
#!/bin/sh
export XKL_XMODMAP_DISABLE=1
unset SESSION_MANAGER
unset DBUS_SESSION_BUS_ADDRESS
export GTK_IM_MODULE=fcitx
export XMODIFIERS=@im=fcitx
export QT_IM_MODULE=fcitx
[ -x /etc/vnc/xstartup ] && exec /etc/vnc/xstartup
[ -r $HOME/.Xresources ] && xrdb $HOME/.Xresources
xsetroot -solid grey
vncconfig -iconic &
ukui-session &
fcitx -d
4.5. 解决 fcitx 僵尸进程
部分系统进入桌面后,发现有[fcitx] 僵尸进程。可以通过在/etc/profile 中增加如下代码解决。
export GTK_IM_MODULE=fcitx
export XMODIFIERS=@im=fcitx
export QT_IM_MODULE=fcitx
4.6. 输入框来回飘
VNC桌面与物理显示器的桌面同时登录时出现“输入法的候选框在两个桌面上来回飘”,输入的字符只在当前桌面上出现一半,另一半显示在另一个桌面上。需要更新下面两个包:
sogouimebs-3.1.2.5245
libxss1
还需要把 /etc/xdg/autostartup/sogouimeservice.desktop 删掉,不然VNC的桌面会起两个该程序,导致输入有问题。同时在 vncserver 的启动脚本中添加 fctix -d & 和搜狗的服务启动。
最新版本:4.2
* 皮肤支持,采用cairo做绘制,pango负责字体,界面支持真透明;
* 拼音支持多个词库:利用createPYMB创建的词库放在~/.config/fcitx/pinyin下面即可;
* 额外的输入法支持(目前只有fcitx-sunpinyin);
* 基于gtk的图形配置工具fcitx-config(并不包含在fcitx源码包中);
* 右键的菜单支持。
官方主页:http://www.fcitx.org/