在 rime中州韵小狼毫 easyEnglish输入法 一文中, 我们定义了 easy-English
输入方案。输入效果如下👇:
我们知道,在英文世界中,单词有首字母大写的习惯,如果我们输入 english
单词后,再回来改首字母为 E
,这体验,不说了,是比较酸爽的。
今天我们将要提供的 Upper_Filter
是一个 rime
中州韵小狼毫输入法中的一个 Filter
,该 Upper_Filter
所提供的功能,是为我们的第一个候选单词,提供一个首字母大写的选项供我们选择使用。效果如下👇:
Upper_Filter.lua
Upper_Filter.lua
文档是我们要定义 Upper_Filter
接口方案的 lua
脚本文档。我们在 Upper_Filter.lua
脚本文档中完成以下👇脚本:
-- Upper_Filter.lua
-- Copyright (C) 2023 yaoyuan.dou <douyaoyuan@126.com>
-- 这个脚本,用于为英文单词提供一个首字母大写的候选项-- 如果需要debug,可以在这里进行函数功能调试
local function _specialFunc(input, env)for cand in input:iter() doyield(cand)end
endlocal function _upperFilter(input, env)local cands = {}local idx, idxSelflocal selfFlglocal candTxtLenidx = 0idxSelf = 0for cand in input:iter() doidx = idx + 1 --索引位置selfFlg = cand.comment:find('☯')if selfFlg then--自动造词数量idxSelf = idxSelf + 1end--匹配英文字母local s,e = string.find(cand.text,"^[a-z]+$")if nil == s then--匹配失败,说明不是英文单词if selfFlg then--对于自动造词选项,使用如下逻辑if idxSelf == 1 and idx == idxSelf then--对于第一条自动造词选项,不加干涉yield(cand)else--对于非第一条自动造词选项,限制其长度--candTxtLen = utf8.len(cand.text)yield(cand)endelse--对于非自动造的词,则正常输出yield(cand)endelse--匹配成功,说明是英文单词yield(cand)if idx == 1 then--如果这是第一个候选词,提供一个首字母大写的选项local thisTxt=cand.text:gsub("^%l",string.upper)yield(Candidate("word", cand.start, cand._end, thisTxt, ''))--idx额外加1idx = idx + 1endendend
endlocal function upperFilter(input, env)--获取debug选项开关状态local debugSwitchSts = env.engine.context:get_option("debug")if debugSwitchSts then_specialFunc(input,env)else_upperFilter(input, env)end
endreturn _upperFilter
👆以上脚本中,存在部分逻辑用于检测候选项是否是完全的英文单词,这是为了避免对非英文单词进行 Upper 转换。这部分的判断在一些中英混输的输入方案中是有作用的。
Upper_Filter.lua
文档应该位于 用户文件夹 下的 lua 文件夹内,如下👇:
rime.lua
同样的,我们在 Upper_Filter.lua
脚本内所定义的 Upper_Filter
方法,需要在 rime.lua
中转成 Upper_Filter
接口。我们在 rime.lua
中增加以下👇配置:
help_translator = require("help")
inputShow_translator = require("inputShow")
inputShow_Filter = require("inputShow_Filter")
Upper_Filter = require("Upper_Filter")
rime.lua
文档应该放置在 用户文件夹 内,如下👇:
easy_en.custom.yaml
Upper_Filter
接口已经准备完成,接下来我们需要在输入方案中配置使用该 Upper_Filter
。承接本文开头所述使用场景,我们在 easyEnglish
输入方案中配置使用 Upper_Filter
。
在 用户文件夹 内的 easyEnglish
输入方案的方案文档 easy_en.schema.yaml
的补丁文档 easy_en.custom.yaml
内,我们配置增加如下👇 Filter
:
patch:engine/filters/+:# 下面的滤镜会对候选项进行格式化处理- lua_filter@Upper_Filter #英文后加空格滤镜# 上面的滤镜会增加候选词选项- uniquifier
👆以上的配置中,我们在 patch
节点下的 engine
节点下的 filter
节点增加了 Upper_Filter
,为了保持候选项的唯一性,我们同时增加了 uniquifier
。
效果欣赏
在完成了一上脚本和配置的修改保存后,重新部署 rime
中州韵/小狼毫 输入法,则我们即可以在 easyEnglish
输入方案下看到 Upper_Filter
所带来的首字母大写的效果,如下👇:
Upper_Filter.lua
/rime.lua
/easy_en.custom.yaml
文档
👆上述 Upper_Filter.lua
、rime.lua
、easy_en.custom.yaml
三个文档,你可以从 Upper_Filter.zip 下载取用。
小结
本文分享了在 rime
中州韵小狼毫输入法中配置 Upper_Filter
滤镜以实现在英文输入中英文单词首字母大写的功能。在 Upper_Filter.lua
文档中定义并实现了首字母大写的功能方法,在 rime.lua
文档中将 Upper_Filter
方法映射为 Upper_Filter
滤镜接口,最后以 easyEnglish
输入方案为例,在 easy_en.custom.yaml
文档中配置了 Upper_Filter
滤镜,最最终观察到了首字母大写的效果。