修复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

截图示例:

rime-ice-lua

保存后,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 的问题,能举一反三也打开调试模式,查看情况准确定位问题。

最后修改于: Thursday, March 26, 2026
欢迎关注微信公众号,留言交流;也欢迎使用我开发的微信小程序。

相关文章:

翻译: