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_MODULEGTK_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