Fcitx5 切换输入法分组时自动恢复中州韵:KDE Plasma 下的轻量解决方案

笔记

切回默认分组,怎么还是英文?

我在 KDE Plasma 的 Wayland 会话里用 Fcitx5 + 中州韵(Rime),平时分成两个输入法组:

分组 包含的输入法 用途
默认 rime、keyboard-us 日常中文输入,需要时在组内切英文
english only keyboard-us 纯英文环境

我想要的操作跟 Windows 的 Win + Space 差不多:按一下换输入语言,平时再用 Shift 切组内的中英文。

用着用着发现一个别扭的地方。从 english only 切回 默认,Fcitx5 有时候还停在英文键盘上。明明已经切回中文分组,还得再按一次键才能用中州韵。

之前为了在托盘显示当前分组,我还写过一个 KDE Plasma 的 Fcitx5 分组指示器。现在已经不用那个东西了,所以这次也不打算重新搞一个常驻程序,只想把切换动作改顺手。

Fcitx5 的分组配置

Fcitx5 的分组信息在 ~/.config/fcitx5/profile。我这里的配置是这样的,省略了键盘布局等字段:

[Groups/0]
Name=默认
DefaultIM=keyboard-us

[Groups/0/Items/0]
Name=rime

[Groups/0/Items/1]
Name=keyboard-us

[Groups/1]
Name="english only"
DefaultIM=keyboard-us

[Groups/1/Items/0]
Name=keyboard-us

这里有个细节:默认 组里虽然有 Rime,DefaultIM 写的却是 keyboard-us。而我遇到的问题还涉及切换分组时的状态恢复。单纯指望它每次自动选到 Rime,不够稳妥。

查了一下 fcitx5-remote 的帮助,发现这几个参数就够用了:

fcitx5-remote -q              # 查询当前分组名称
fcitx5-remote -n              # 查询当前输入法名称
fcitx5-remote -g '默认'       # 切换到指定分组
fcitx5-remote -s rime         # 指定当前输入法为 Rime

我决定让 KDE 的快捷键直接调用脚本。切到 默认 时,再补一条指定 Rime 的命令。

写个脚本接管分组切换

脚本放在 ~/.local/bin/fcitx5-group-toggle,用下面这段命令创建:

mkdir -p ~/.local/bin

cat > ~/.local/bin/fcitx5-group-toggle <<'EOF'
#!/usr/bin/env bash
set -euo pipefail

# Switch the two Fcitx5 groups. Always select Rime on entering 默认.
case "$(fcitx5-remote -q)" in
  'english only')
    fcitx5-remote -g '默认'
    fcitx5-remote -s rime
    ;;
  '默认')
    fcitx5-remote -g 'english only'
    ;;
  *)
    printf 'Unknown Fcitx5 group; no change made.\n' >&2
    exit 1
    ;;
esac
EOF

chmod +x ~/.local/bin/fcitx5-group-toggle

关键是从英文组切回来时连着执行两条命令:

fcitx5-remote -g '默认'
fcitx5-remote -s rime

先回到 默认,再选 rime。去 english only 就省事了,它只有 keyboard-us,切组就行。

脚本只认识这两个分组,碰到别的名称就报错退出。复制的时候记得改成自己的分组名,空格和大小写都要对上。

绑定到 KDE 的 Meta + Space

打开 KDE 的 系统设置 → 键盘 → 快捷键,添加一个“命令或脚本”快捷键:

  • 名称:Fcitx5 分组切换(随便起)
  • 命令:/home/你的用户名/.local/bin/fcitx5-group-toggle
  • 快捷键:Meta + Space(Win + 空格)

如果这个快捷键已经被占用,先把原来的绑定取消。我之前用 Fcitx5 自己的分组切换快捷键,后来把它删了;Fcitx5 配置工具的“全局选项”里可以检查。

原来的 Shift 组内切换我没有动,Meta + Space 现在负责这两个分组。

按一次快捷键就运行一次脚本,用完即退,不需要配 systemd 服务。

实测了一遍

为了验证是不是每次都能恢复 Rime,我先故意把 默认 组改成英文键盘:

fcitx5-remote -s keyboard-us

然后连续运行两次脚本,用 fcitx5-remote -q 和 fcitx5-remote -n 查看状态:

操作 当前分组 当前输入法
初始,手动选英文键盘 默认 keyboard-us
第一次执行脚本 english only keyboard-us
第二次执行脚本 默认 rime

第二次运行后,当前输入法已经是 rime,没再停在 keyboard-us。之后我在 KDE 里手动加了快捷键,实际按起来也正常。

还有两个小坑

fcitx5-remote -s rime 只是让 Fcitx5 选中 Rime。如果 Rime 内部的 ascii_mode 本来就处在英文状态,这条命令不保证能把它改回中文。要处理那个问题,还得再看 Rime 自己的配置。

另外,从 Fcitx5 托盘菜单里直接切组,还是走原本的逻辑,不会执行脚本里的 -s rime。如果想让所有切组方式都自动选中 Rime,那就得监听分组变化。我平时直接按快捷键,这一步暂时没必要。

现在的切换效果

现在按 Meta + Space 时,实际执行的是:

Meta + Space
  ├─ 默认         → english only(英文键盘)
  └─ english only → 默认 → 强制选中 Rime

脚本就这么点内容,以后要换分组名或者换输入法,直接改这里就好。