fcitx5-rime(万象输入法)Shift/CapsLock 中英文切换失效 — 修复说明

1. 原因(Root Cause)

问题不在 rime 的配置,而在 Omarchy/Hyprland 的键盘层把 CapsLock 和 Shift 截胡了。

Omarchy 默认的 Hyprland 配置(/usr/share/omarchy/default/hypr/input.lua)里设置了:

local kb_options = "compose:caps,shift:both_capslock_cancel"

它在合成器/XKB 层面(比 fcitx5 更底层)改键:

compose:caps

把 CapsLock 键改成了 Compose 键(Multi_key)。按 CapsLock 时,Hyprland 发给 fcitx5 的不是 Caps_Lock,而是 Multi_key。fcitx5-rime 会把它当作组合键 (compose 序列)吞掉,根本不会转发给 rime,所以 rime 里的 Caps_Lock: clear (切换中英)永远收不到这个键。

shift:both_capslock_cancel

双 Shift 组合触发 CapsLock、单 Shift 取消它,干扰了 rime 的“单击 Shift 切换中英” 逻辑。

rime 配置本身是对的(~/.local/share/fcitx5/rime/default.yaml 里 ascii_composer/switch_key 的 Caps_Lock: clear、Shift_L/R: commit_code 都在,且已正确部署到 build/),问题就出在这一层键位重映射上。

2. 修复(What I did)

在用户覆盖文件 ~/.config/hypr/input.lua(原文件已备份)里加了覆盖,清空 kb_options:

hl.config({
  input = {
    kb_options = "",
  },
})

应用并验证:

hyprctl reload          # → ok
hyprctl configerrors    # → 无错误
hyprctl getoption input:kb_options   # → str: (空)  set: true

现在 CapsLock 和 Shift 都是标准键了。

3. 使用说明(How to use now)

  • CapsLock:直接按一下即可切换中/英文状态(它不再是大写锁定,也不再是 Compose 键)。
  • Shift:需要快速点按(按下后 500ms 内松开)才会切换;按住 Shift 仍然是 输入大写字母。这是 librime 的设计,用来区分“点按切换”和“按住打大写”。
  • 若改完立刻测试没反应:重新聚焦输入框,或重启输入法: fcitx5-remote -r(或 fcitx5 -r -d)。

4. 副作用(Compose key lost)

compose:caps 是 Omarchy 特意把 CapsLock 设成 Compose 键来打特殊字符(如 é、 ™)的。清空后这个 Compose 键功能就没了。

如果想继续保留 Compose 键,可以把它换绑到别的键上(例如右 Alt):

hl.config({
  input = {
    kb_options = "compose:ralt",
  },
})