修復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批量下載圖像