修复rime-ice无法弹出候选框的问题
Linux 下的中文输入是个老生常谈的问题,我也写过很多相关文章,自从 chromium 和 electron 新版本后,已经很久没遇到无法输入中文的问题了。
可是最近突然发现,晚上在家玩 Dota2 时没法打中文(弹不出候选框!),切换到终端 ghostty、Firefox、obsidian 问题一样存在。当局我的队友选了个小强、到 6 级不抓人还赖线占本大哥敌法师的资源,打不了中文干着急(只能打拼音)。
游戏结束后,赶紧排错,记录过程如下,希望能帮到更多人。
一开始我以为是中英文切换的问题,实际不是的。因为 waybar 上显示状态切换正常,鼠标点击手动切换问题依旧。
1. 打开调试模式排错
可以先把输入法进程杀了 pkill fcitx5, 再运行调试模式:
1fcitx5 --verbose 5
5 意为 debug,fcitx5 --help 能查到相关说明。如果你不打开 debug,基本等于盲人摸象瞎折腾!其实,往后遇到类似问题,优先建议打开调试日志。
针对我的情况,心里清楚那么多软件同时有问题,肯定是输入法本身有问题,和上层软件关系不大(Linux 中文输入相关的排错链路比较长,有兴趣可以去翻翻我之前写的文章)。
这个时候会触发报错,会输出如下错误日志:
1E20260326 13:45:19.376029 140583420058240 lua_gears.cc:83] Lua Compoment of autoload error:( module: *search name_space: radical_pinyin status: 2 ): error loading module 'search' from file '/usr/share/rime-data/lua/search.lua':
2 /usr/share/rime-data/lua/search.lua:24: attempt to assign to const variable 'i'
3E20260326 13:45:19.376039 140583420058240 lua_gears.cc:131] Lua Compoment of initialize error:( module: *search name_space: radical_pinyin func type: string ): func type error expect function
4E20260326 13:45:19.640052 140583420058240 lua_gears.cc:17] LuaTranslation::Next error(2): [string "table.unpack = table.unpack or unpack..."]:4: attempt to call a string value (upvalue 'f')
5E20260326 13:45:19.775707 140583420058240 lua_gears.cc:17] LuaTranslation::Next error(2): [string "table.unpack = table.unpack or unpack..."]:4: attempt to call a string value (upvalue 'f')
6E20260326 13:45:21.215213 140583420058240 lua_gears.cc:17] LuaTranslation::Next error(2): [string "table.unpack = table.unpack or unpack..."]:4: attempt to call a string value (upvalue 'f')
到这里,问题很明朗了。
/usr/share/rime-data/lua/search.lua:24: attempt to assign to const variable 'i' 新版本的 Lua 5.4 及以上版本中,for i=1,n do 定义的循环变量 i 是常量,不允许在循环内部重新赋值。
1-- 获取指定字符在文本中的位置
2local function get_pos( text, char )
3 local pos = {}
4 if text:find( char ) then
5 local tmp = text
6 for i = 1, utf8.len( tmp ) do
7 local first_char = tmp:sub( 1, utf8.offset( tmp, 2 ) - 1 )
8 if first_char == char then pos[i] = true end
9 tmp = tmp:gsub( '^' .. first_char, '' )
10 i = i + 1 -- 错误在这里
11 end
12 end
13 return pos
14end
把上面的 search.lua 的代码块,i = i + 1, 直接注释掉即可解决问题。
或者
1for i = 1, #list do
2 local j = i -- 用新变量 j 代替 i 做运算
3 j = j + 1 -- 修改变量 j,不碰循环变量 i
4end
截图示例:

保存后,fcitx5 -rd 重启下,问题即可修复。
2. 这个问题如何产生的
大概率是因为 Arch linux 中的 fcitx5-lua 于 2026-03-23 15:27 UTC 包更新了,升级了 lua,里面的 lua 版本调用逻辑未考究,没那么多时间。
1➜ ~ paru -Ql rime-ice-pinyin-git | grep search
2rime-ice-pinyin-git /usr/share/rime-data/lua/search.lua
从上面的输出中可以看到,问题代码 search.lua 来自 rime-ice-pinyin-git
查看 rime-ice 源码,发现 https://github.com/iDvel/rime-ice/issues/1502 此问题已经有人在 MacOS 上报告,且已经合并修复。
而不巧的是 AUR 仓库中 rime-ice-pinyin-git还没有及时更新(Last Updated: 2025-10-31 20:42 (UTC)),所以触发了问题。
rime-ice 的 search.lua 原始来源 https://github.com/mirtlecn/rime-radical-pinyin,具体 rime-radical-pinyin 的作用可看其仓库说明。( 看该仓库的提交记录,也已修复该问题)
总结错误链路:
lua 升级 --> search.lua 语法错误 --> rime-ice 无法弹出候选框
上游修复了,下游的包还没有来得及更新,包没有更新,用户就遭罪了,只能自己定位搜索修复,我也是先修复再查资料才理顺情况的。
3. 总结
这个问题说小也小,毕竟只是 AUR 包没来得及更新,说大也大,中文用户汉字都没法输入了,还玩个鬼!能怪谁呢?这就是 Linux 用户的日常,遇到问题自己想办法搞定,还能学到奇怪的知识😅。也许维护 rime-ice-pinyin-git 这个包的人要养儿育女无暇兼顾,要知道大多数包维护人员是免费无私奉献的。
记录发布这个文章也要消耗我不少时间,只希望能帮到更多的人,比如下次遇到别的 Fcitx5 的问题,能举一反三也打开调试模式,查看情况准确定位问题。

版权申明:
- 未标注来源的内容全部为原创,未经授权请勿转载(因转载后排版往往错乱、内容不可控、无法持续更新等);
- 非营利为目的,演绎本博客任何内容,请以'原文出处'或者'参考链接'等方式给出本站相关网页地址(方便读者)。
相关文章:
- 窗口管理器labwc使用记
- 开机滚动字体显示优化
- 树莓派上部署Vaultwarden
- 使用goaccess实时分析Caddy日志
- 个人网站监控
- Hugo全站AVIF记
- Linux下尝试使用Godot开发小游戏
- Arch linux dae 透明代理
- Airflow接管galler-dl下载任务
- 如何使用gallery-dl批量下载图像