title: “修复WPS Office的Fcitx5输入法问题 - 星外之神的博客 | wszqkzqk Blog” source: “https://wszqkzqk.github.io/2024/03/09/WPS-Fcitx5/" author: published: 2024-03-09 created: 2026-03-19 description: “天下难事,必作于易;天下大事,必作于细” tags:
- “clippings”
前言
以前,Fcitx5一般会要求用户在 /etc/environment 中添加有关环境变量的配置,例如:
XMODIFIERS=@im=fcitx
GTK_IM_MODULE=fcitx
QT_IM_MODULE=fcitx
SDL_IM_MODULE=fcitx
GLFW_IM_MODULE=ibus
然而,在Wayland合成器中,如果存在这些环境变量,可能会遇到Fcitx5闪烁的情况,可能会影响用户体验。
Fcitx5在KDE Wayland下建议通过 系统设置->键盘->虚拟键盘 来选择Fcitx5输入法。由于KDE Plasma支持1-3版的Wayland输入法协议,因此,仅建议在环境变量中添加:
XMODIFIERS=@im=fcitx
其他环境变量不需要添加。
然而,WPS Office静态链接了Qt5,不受系统的Qt库控制,由于某种原因不能应用这样选择的输入法,导致无法输入中文。
解决方法
由于在以前添加了环境变量的时候,WPS Office是可以正常输入中文的,因此,只要我们单独给WPS Office添加环境变量,就可以解决这个问题。
单独给WPS Office添加环境变量可以由很多方式实现,比如说编辑WPS Office的启动脚本、使用额外启动脚本替代WPS Office的启动脚本、编辑WPS Office的.desktop 文件等等。然而,这些方法会在WPS Office的每次更新后失效。
笔者选择了将WPS Office的.desktop 文件复制到 ~/.local/share/applications 目录下。
cp /usr/share/applications/wps-office*.desktop ~/.local/share/applications/
然后编辑该文件的启动命令,实现单独给WPS Office添加环境变量。在原有的文件中,找到 Exec= 一行,形如:
Exec=/usr/bin/wps %F
为了单独给WPS Office添加环境变量,我们可以将其修改为:
Exec=env XMODIFIERS="@im=fcitx" GTK_IM_MODULE="fcitx" QT_IM_MODULE="fcitx" SDL_IM_MODULE=fcitx GLFW_IM_MODULE=ibus /usr/bin/wps %F
这里,我们使用 env 命令来临时添加环境变量,这样,我们就可以在不修改WPS Office的启动脚本的情况下,实现单独给WPS Office添加环境变量。
然后,刷新菜单缓存:
update-desktop-database ~/.local/share/applications/
这样,我们就可以在KDE Wayland的建议配置下正常使用WPS Office的输入法了。
通用配置
对于静态链接Qt等基础库且较老、未适配Wayland输入法协议的专有软件,可以在启动脚本中加入由 7Ji和devome想到的一个通用Hack :
case "${XMODIFIERS}" in
*@im=fcitx*)
export QT_IM_MODULE fcitx
export GTK_IM_MODULE fcitx
;;
*@im=ibus*)
export QT_IM_MODULE ibus
export GTK_IM_MODULE ibus
export IBUS_USE_PORTAL 1
;;
esac
这个Hack假设了Wayland用户会设置 XMODIFIERS 这一环境变量,然后根据 XMODIFIERS 的值来设置 QT_IM_MODULE 和 GTK_IM_MODULE 。这样可以实现既使用Wayland的推荐设置,又能让这些旧软件正常使用输入法。
同样,如果希望在Wayland和x11环境下切换,也可以在 ~/.xprofile 中加入这个设定。
另一种方案是往包管理器里添加hook,从而在更新包之后自动执行这个patch Exec的命令。
比如说我用的是Arch的pacman,我就可以往 /etc/pacman.d/hooks/fcitx-patch-for-wps.hook 写入以下内容:
[Trigger]
Operation = Upgrade
Operation = Install
Type = Package
Target = wps-office-cn
Target = wps-office-mime-cn
[Action]
Description = Fix fcitx not working in WPS
When = PostTransaction
Exec = /usr/bin/bash -c "/usr/bin/sed -i -E -e 's/Exec ?= ?/Exec=env XMODIFIERS="@im=fcitx" GTK_IM_MODULE="fcitx" QT_IM_MODULE="fcitx" SDL_IM_MODULE=fcitx /g' /usr/share/applications/wps-office*.desktop"
@Young-Lord
另一种方案是往包管理器里添加hook,从而在更新包之后自动执行这个patch Exec的命令。
比如说我用的是Arch的pacman,我就可以往/etc/pacman.d/hooks/fcitx-patch-for-wps.hook写入以下内容:[Trigger] Operation = Upgrade Operation = Install Type = Package Target = wps-office-cn [Action] Description = Fix fcitx not working in WPS When = PostTransaction Exec = sed -i -E -e 's/Exec ?= ?/Exec=env XMODIFIERS="@im=fcitx" GTK_IM_MODULE="fcitx" QT_IM_MODULE="fcitx" SDL_IM_MODULE=fcitx /g' /usr/share/applications/wps-office*.desktop