我之前成功实现了让 Rime 输入法支持简繁混合输入,但实际用下来发现只是徒增烦恼,因为这样会打乱原本手熟的排序,极大地增加输入的时间和精力成本,于是输入法又变成了纯简体版本。
但最近,因为工作,需要输入「昇」这个特定的繁体字,而简体字版本的 Rime 是无法直接输入这个字的——即使把「昇」加入到自定义词表中也无法实现。
研究了 2 个晚上,终于在 Claude 的帮助下找到了解决方案。
实际上,Claude 给出了不少方案,但实测下来目前只有这一个能行。
该方案基于 Lua 脚本。
第一步,在 用户文件夹/Lua
中新建一个 Lua 脚本,比如 namex.lua
。脚本内容如下:
-- 特殊字符处理
local special_chars = {
["升"] = "昇",
["龙"] = "龍"
-- 可以添加更多特殊单字对
}
-- 特殊词组处理
local special_words = {
["升腾"] = "昇腾"
-- 可以添加更多特殊词组对
}
local function filter(input, env)
-- 记录已经处理过的特殊字符
local handled = {}
-- 第一遍:正常输出所有候选项并标记特殊字符/词组
for cand in input:iter() do
yield(cand)
-- 检查单字
if special_chars[cand.text] then
handled[cand.text] = true
-- 如果找到了特殊字符,立即在后面添加对应的繁体字符
if not handled[special_chars[cand.text]] then
local fan_text = special_chars[cand.text]
local new_cand = Candidate("char", cand.start, cand._end, fan_text, "")
new_cand.quality = cand.quality - 1 -- 稍微降低权重
yield(new_cand)
handled[fan_text] = true
end
end
-- 检查词组
if special_words[cand.text] then
handled[cand.text] = true
-- 如果找到了特殊词组,立即在后面添加对应的繁体词组
if not handled[special_words[cand.text]] then
local fan_text = special_words[cand.text]
local new_cand = Candidate("word", cand.start, cand._end, fan_text, "")
new_cand.quality = cand.quality - 1 -- 稍微降低权重
yield(new_cand)
handled[fan_text] = true
end
end
end
end
return filter
如果想要新增繁体字或词组,可以在上面对应位置补充。
或者,也可以使用这个更简单的脚本:
-- 特殊字符处理
local special_pairs = {
["升"] = "昇"
-- 可以添加更多特殊字符对
}
local function filter(input, env)
-- 记录已经处理过的特殊字符
local handled = {}
-- 第一遍:正常输出所有候选项并标记特殊字符
for cand in input:iter() do
yield(cand)
-- 检查是否存在特殊字符对
if special_pairs[cand.text] then
handled[cand.text] = true
elseif special_pairs[cand.text] then
handled[cand.text] = true
end
-- 如果找到了特殊字符,立即在后面添加对应的繁体/简体字符
if special_pairs[cand.text] and not handled[special_pairs[cand.text]] then
local fan_text = special_pairs[cand.text]
local comment = "繁体"
local new_cand = Candidate("char", cand.start, cand._end, fan_text, comment)
new_cand.quality = cand.quality - 1 -- 稍微降低权重
yield(new_cand)
handled[fan_text] = true
end
end
end
return filter
第二步,在 rime.lua
文件中新增一行:
namex_filter = require("namex")
第三步,在 你的输入方案.custom.yaml
文件中新增:
engine/+:
filters/+:
- lua_filter@namex_filter
完工。重新部署即可。