|
|
环境:Ubuntu / XFCE 桌面,fcitx5 + 五笔输入法,SecureCRT 9.x
━━━━━━━━━━━━━━━━━━━━
背景
从 GNOME + ibus 迁移到 XFCE + fcitx5 之后,几乎所有软件的中文输入都正常,唯独 SecureCRT 例外——光标停在那里,切换输入法、按快捷键,什么反应都没有,字符就是进不去。
这种问题看起来应该有标准解法,实际上折腾了好几个来回。
━━━━━━━━━━━━━━━━━━━━
第一步:设置环境变量(无效)
遇到 Linux 下输入法不工作,第一反应是环境变量没设置。标准做法是在启动命令前加上:
- GTK_IM_MODULE=fcitx QT_IM_MODULE=fcitx XMODIFIERS=@im=fcitx SecureCRT
复制代码
同时修改用户级文件(- ~/.local/share/applications/SecureCRT.desktop
复制代码 ),将行改为带环境变量的启动命令,覆盖系统级配置。
结果:无效。
━━━━━━━━━━━━━━━━━━━━
第二步:发现 SecureCRT 自带 Qt6 库
用查看 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,而是在下自带了一套 Qt 6.8.4 运行库。这意味着系统里安装的插件对 SecureCRT 毫无作用——它根本不会去加载系统的目录。
━━━━━━━━━━━━━━━━━━━━
第三步:尝试复制 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 前端模拟(),可以对外表现为 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
复制代码
中文输入成功。
关键在于显式传入。SecureCRT 的 ibus 插件需要知道连接地址,仅靠不足以自动发现 fcitx5 提供的 ibus 模拟服务。
━━━━━━━━━━━━━━━━━━━━
第六步:固化为启动脚本
返回的地址中包含 fcitx5 每次启动随机生成的字符串,不能硬编码。改为直接读取 fcitx5 写入的地址文件,更稳定、不依赖命令是否在 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 "$@"
复制代码
用户级文件的行改为调用此脚本:
- 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 绕过了用户级覆盖机制,直接读取下的系统文件。将 dockitem 指向用户级版本:
- [PlankDockItemPreferences]
- Launcher=file:///home/chin/.local/share/applications/SecureCRT.desktop
复制代码
重启 Plank:
问题彻底解决。
━━━━━━━━━━━━━━━━━━━━
总结
| 排查步骤 | 结论 |
|---|---|
| 设置环境变量 | 无效,SecureCRT 不加载系统 Qt 插件 |
| 复制系统 fcitx5 Qt 插件 | 版本不兼容(Qt 6.4 vs 6.8.4) |
| 利用 fcitx5 内置 ibus 前端 | 有效,绕过 Qt 版本问题 |
| 脚本读取 ibus 地址文件 | 替代命令,兼容非交互式启动 |
| 修改 Plank dockitem 路径 | 修复 dock 不走用户 .desktop 的问题 |
根本原因:SecureCRT 自带 Qt 6.8.4 运行库,与系统 Qt 完全隔离,导致所有基于系统 Qt 插件目录的输入法方案失效。最终解决方案是利用 fcitx5 已有的 ibus 协议兼容层,配合 SecureCRT 自带的 ibus 输入插件,绕过 Qt 版本壁垒。 |
|