要论小众输入法,RIME 中州韵输入引擎绝对是绕不开的话题。站内已经有数篇文章推介它,但本文希望更近一步,介绍一个真正能解放 RIME 潜力的项目:librime-lua。
简而言之,此项目能让用户用 lua 脚本语言进一步定制输入法。librime-lua 将 librime(即 RIME 后端引擎)提供的 C++ API 以 lua 对象的形式提供,我们能用一种极其简单易学的脚本语言扩展 RIME 的各个工序,实现云拼音、多语言翻译、自动添加空格等等需求。
除了少数 Linux 发行版外,librime-lua 是预置在 RIME 中的默认插件之一,无需额外安装编译。在 RIME 前端对应的用户目录中新建 lua 目录后,就可以在该目录下新建、编写 librime lua 脚本了。导入、配置这些脚本的办法可以参考少数派的以往文章或者官方文档,这里不再赘述。
本文中,我将介绍几个具体的案例以体现 librime lua 强大的扩展能力。
自动标点切换和补全
- 脚本地址:processor.lua | 使用示例
如果你像我一样频繁混用中英文,还惯用 Markdown 写作的话,短时间内多次切换中英标点想必已经成为家常便饭。不妨直接来看,如果有了 librime lua,我们能做到何种效果:
上面的录制过程中,我全程没有切换中英文模式,也没有切换标点输入模式,由脚本根据已经输入上下文判断,进而改变、补全要上屏的标点:
- 中文后中文标点;
- 输入英文、数字后,部分标点、按键自动变为英文,数字后的英文直接上屏:例如输入网址时,先打了
https
,那么后面的冒号、斜杠、点号都会被调整为 ASCII 字符,直到网址输入完毕; - 对于固定搭配的标点,此脚本还可以为你自动补全。例如 Markdown 的图片插入语法:
![]()
,当输入到第二个字符[
时,脚本会将全部语法符号全部补全。
本例脚本的功能可以总结为:根据情况对同样的按键做不同的处理。这用到了 lua_processor
的能力。一个输入法引擎,吃进去的是按键,吐出来的是汉字,RIME 将其分为几道工序。processor 是第一道工序,负责处理按键事件,或者直接放行,或者直接拦截,或者触发其他事件。下面两行是本脚本的主函数:
function P.func( key, env )
end
用户每有一次按键事件都会触发上面的函数,向其传入一个 key 参数,其中含有本次按键的键值、是否为组合键等信息。因此,本例的脚本抽象下来只有两步:
- 比对本次按键
string.char( key.keycode )
是否为设定的标点符号; - 根据之前的输入
context.commit_history:latest_text()
的类型处理按键。
生成、记录英文候选词
- 脚本地址:parrot_translator.lua | 使用示例
展示完 lua_processor,我们再来看看 lua_translator,在这道工序中,输入法的编码部分会被转换为候选词。这个接口允许我们动态生成候选词。