冷蟊初退 孤灯野澜 志起鸡鸣 墓不悲秋 技术交流 软件开发 商业合作 加Q:411239339

在 XFCE + fcitx5 下让 SecureCRT 支持中文输入

浏览:20次阅读
没有评论

共计 2962 个字符,预计需要花费 8 分钟才能阅读完成。

环境:Ubuntu / XFCE 桌面,fcitx5 + 五笔输入法,SecureCRT 9.x


背景

从 GNOME + ibus 迁移到 XFCE + fcitx5 之后,几乎所有软件的中文输入都正常,唯独 SecureCRT 例外——光标停在那里,切换输入法、按快捷键,什么反应都没有,字符就是进不去。

这种问题看起来应该有标准解法,实际上折腾了好几个来回。


第一步:设置环境变量(无效)

遇到 Linux 下输入法不工作,第一反应是环境变量没设置。标准做法是在启动命令前加上:

GTK_IM_MODULE=fcitx QT_IM_MODULE=fcitx XMODIFIERS=@im=fcitx SecureCRT

同时修改用户级 .desktop 文件(~/.local/share/applications/SecureCRT.desktop),将 Exec 行改为带环境变量的启动命令,覆盖系统级配置。

结果: 无效。


第二步:发现 SecureCRT 自带 Qt6 库

ldd 查看 SecureCRT 的动态链接依赖:

ldd /usr/bin/SecureCRT | grep -i qt

输出揭示了问题所在:

libQt6Widgets.so.6 => /usr/bin/../lib/scrt-sfx/libQt6Widgets.so.6
libQt6Core.so.6   => /usr/bin/../lib/scrt-sfx/libQt6Core.so.6
...

SecureCRT 完全不使用系统 Qt6,而是在 /usr/lib/scrt-sfx/ 下自带了一套 Qt 6.8.4 运行库。这意味着系统里安装的 fcitx5-frontend-qt6 插件对 SecureCRT 毫无作用——它根本不会去加载系统的 platforminputcontexts 目录。


第三步:尝试复制 fcitx5 Qt 插件(版本不兼容)

SecureCRT 有自己的插件目录:

/usr/lib/scrt-sfx/plugins/platforminputcontexts/
├── libcomposeplatforminputcontextplugin.so
└── libibusplatforminputcontextplugin.so

没有 fcitx5 插件。恰好系统里有一个专门为 SecureCRT 准备的插件位于 /usr/lib/scrt/plugins/platforminputcontexts/libfcitx5platforminputcontextplugin.so,看起来只需要复制过去。

但检查版本后发现:

strings /usr/lib/scrt/plugins/.../libfcitx5platforminputcontextplugin.so | grep "Qt_6"
# → Qt_6.4

strings /usr/lib/scrt-sfx/libQt6Core.so.6 | grep "^6\."
# → 6.8.4

Qt 插件与运行库版本必须匹配。6.4 的插件无法加载到 6.8.4 的 Qt 环境中。此路不通。


第四步:注意到 SecureCRT 自带 ibus 插件

重新审视 SecureCRT 的插件目录,它已经内置了 libibusplatforminputcontextplugin.so

这提供了另一条路:fcitx5 内置 IBus 前端模拟 libibusfrontend.so),可以对外表现为 ibus 守护进程。SecureCRT 有 ibus 插件,fcitx5 能模拟 ibus——两者本可以对话。

验证 fcitx5 的 ibus 模拟是否运行:

ibus address
# → unix:path=/run/user/1000/bus,fcitx_random_string=ebe631b875d348c88d478d6815fd899e

地址存在。同时 fcitx5 会将地址写入文件:

cat ~/.config/ibus/bus/*-unix-0
# IBUS_ADDRESS=unix:path=/run/user/1000/bus,fcitx_random_string=...
# IBUS_DAEMON_PID=2528

第五步:用 ibus 协议启动 SecureCRT(成功)

IBUS_ADDRESS=$(ibus address) QT_IM_MODULE=ibus XMODIFIERS=@im=ibus SecureCRT

中文输入成功。

关键在于显式传入 IBUS_ADDRESS。SecureCRT 的 ibus 插件需要知道连接地址,仅靠 XMODIFIERS 不足以自动发现 fcitx5 提供的 ibus 模拟服务。


第六步:固化为启动脚本

ibus address 返回的地址中包含 fcitx5 每次启动随机生成的字符串,不能硬编码。改为直接读取 fcitx5 写入的地址文件,更稳定、不依赖 ibus 命令是否在 PATH 中:

# ~/.local/bin/securecrt-launch.sh
#!/bin/bash
IBUS_ADDRESS=$(grep -h "^IBUS_ADDRESS=" ~/.config/ibus/bus/*-unix-0 2>/dev/null \
    | grep -v "^IBUS_ADDRESS=$" | head -1 | cut -d= -f2-)
export IBUS_ADDRESS
export QT_IM_MODULE=ibus
export XMODIFIERS=@im=ibus
exec SecureCRT "$@"

用户级 .desktop 文件的 Exec 行改为调用此脚本:

Exec=/home/chin/.local/bin/securecrt-launch.sh

第七步:修复 Plank dock 不走用户 .desktop 的问题

从 Plank dock 点击图标仍然不能输入中文。检查 Plank 的启动器配置:

cat ~/.config/plank/dock1/launchers/SecureCRT.dockitem
# Launcher=file:///usr/share/applications/SecureCRT.desktop

Plank 绕过了用户级 .desktop 覆盖机制 ,直接读取 /usr/share/applications/ 下的系统文件。将 dockitem 指向用户级版本:

[PlankDockItemPreferences]
Launcher=file:///home/chin/.local/share/applications/SecureCRT.desktop

重启 Plank:

pkill plank && plank &

问题彻底解决。


总结

排查步骤 结论
设置 QT_IM_MODULE=fcitx 环境变量 无效,SecureCRT 不加载系统 Qt 插件
复制系统 fcitx5 Qt 插件 版本不兼容(Qt 6.4 vs 6.8.4)
利用 fcitx5 内置 ibus 前端 有效 ,绕过 Qt 版本问题
脚本读取 ibus 地址文件 替代 ibus 命令,兼容非交互式启动
修改 Plank dockitem 路径 修复 dock 不走用户 .desktop 的问题

根本原因 :SecureCRT 自带 Qt 6.8.4 运行库,与系统 Qt 完全隔离,导致所有基于系统 Qt 插件目录的输入法方案失效。最终解决方案是利用 fcitx5 已有的 ibus 协议兼容层,配合 SecureCRT 自带的 ibus 输入插件,绕过 Qt 版本壁垒。

正文完
创作不易,扫码加点动力
post-qrcode
 0
果较瘦
版权声明:本站原创文章,由 果较瘦 于2026-04-02发表,共计2962字。
转载说明:除特殊说明外本站文章皆由果较瘦原创发布,转载请注明出处。