小狼毫输入法只有一个候选词时直接上屏脚本

昨天将小狼毫输入法雾凇拼音输入方案的辅码由部件拆字/拼音输入方案修改为五笔画输入方案后,发现输入时即使只剩下一个候选词了,仍然需要按空格键或者数字键1才能完成候选词上屏的动作,尽管网上有文章说打开auto_select:true选项即可实现只有一个候选词时自动上屏,但在我安装的0.17.3版本上实测,这个选项只能够完成字典里没有重码时的自动上屏,例如在custom_phrase_double.txt中添加的“·    jg”,用微软双拼输入“jg”时“·”可以自动上屏,但是输入“hj`nnnzn”,即使只剩下唯一的候选字“汉”,它仍然不能自动上屏。

在没找到简单方案实现这个功能的情况下,于是想到了用脚本实现。先是试了试AI能不能直接给出可用的脚本,但是没有成功。后来找到了rime文档,这里面有个脚本开发指南,算是有了一点基本概念,折腾了一天半,最后在DeepSeek-Reasoner的支持下,总算实现了这个功能。

以下是auto_commit_filter.lua脚本:

-- 只有一个候选词时自动提交,仅测试了小狼毫0.17.3版本

local function auto_commit_filter(input, env)
  local candidates = {}
    
    -- 首先收集所有候选词
    for cand in input:iter() do
        table.insert(candidates, cand)
    end

    -- 当且仅当有唯一候选时自动上屏
    if #candidates == 1 then
        env.engine:commit_text(candidates[1].text)
        env.engine.context:clear()
        return
    end

    -- 多个候选时正常显示
    for _, cand in ipairs(candidates) do
        yield(cand)
    end
end

return auto_commit_filter

这里要注意的关键是:Rime的输入迭代器只能遍历一次,在第一次遍历输入迭代器以统计候选词数目时,应该先将所有候选词收集到一个表中,这样,如果候选词数量超过1个时可以遍历这个表并正常显示候选词。一开始就是因为没有get到这一点,统计候选词数目时遍历了一次输入迭代器,处理候选词数量超过1个的情况时,又一次遍历输入迭代器,结果候选词显示不出来,拿着编好的代码找了好几个AI来修改,结果DeepSeek-Reasoner率先给出了正确的答案,给它点个赞。

另一个知识点是:如果开发过程中需要输出变量的值以判断程序逻辑是不是有问题,可以直接使用log对象,这一点前面提到的文档提到了。为了方便查找,我一般直接用error方法,因为信息比较少一点。输出的内容可以通过右键点击小狼毫输入法的“中”字图标在弹出菜单中选择“日志文件夹”打开文件路径,然后找到文件名带“ERROR”(用error方法的话)的日志文件打开即可找到输出的调试信息。

完成上面的脚本后,保存在用户文件夹下的“lua”目录中,然后修改配置文件。找到需要实现唯一候选词直接上屏功能的输入法的“.schema.yaml”文件(例如雾凇输入法的全拼输入配置文件名是“rime_ice.schema.yaml”,微软双拼的配置文件名则是“double_pinyin_mspy.schema.yaml”,修改哪个输入方案的配置文件哪个输入方案就具有这个功能),打开文件后找到“engine/filters”节点,在该节点最后(其他位置添加是不是可以我没试)添加:

    - lua_filter@*auto_commit_filter                # 一个候选词自动提交

所添加的项目的具体含义前面提到的文档也有说明。lua_filter 为小狼毫输入法的 librime-lua 插件提供的过滤器脚本接口,librime-lua 将 RIME 的用户目录和 RIME 共享目录下的 lua 目录加入了模块搜索路径,所以脚本文件保存在用户文件夹下就无需指定模块文件路径,星号则表示后面的名字是模块名而不是全局变量名。当遇到星号时,librime-lua 会在内部先使用 require 机制加载模块,然后将其返回值作为 RIME 组件加载到输入法框架中,无需再创建 rime.lua 在其中加入 require 语句。模块名也就是 lua 脚本的主文件名。

现在可以愉快地享受省去按键将唯一候选词上屏的功能了。

你可能感兴趣的:(办公软件,小狼毫输入法,雾凇,唯一候选词直接上屏)