在 Rime 拼音方案中输入英文
用 easy_en 方案挂载到自己的主输入方案(全拼、双拼、五笔等),就可以同时输入英文单词。
我用的是 melt_eng 方案,差不多,我觉得这个更舒服,支持大小写同时响应。
示例:
# 在主方案配置文件,如 pinyin_simp 或 luna_pinyin
# ...
schema:
dependencies:
- melt_eng
# ...
engine:
translators:
- table_translator@melt_eng
# ...
melt_eng:
dictionary: melt_eng
这样挂载了英文方案与英文词库,在拼音方案下就可以输入英文单词。
因为不是同一个翻译器,英文不会和拼音共同造词,比如输入「applediannao」,并不会自动生成「Apple电脑」,只能给常用的中英混合词汇单独弄一个词典。
期望的行为:
- 拼音优先
输入「ma」,前几个候选项应为「吗 嘛 马」,而不是「Mac mad man」。
- 重码时拼音优先
如「四则」与 size 冲突时,希望「四则」排在第一位
- 短单词优先
输入「mac」「shit」「app」,第一候选项应为「Mac」「shit」「App」,而不是「马车」「试听」「挨批评」。
- 未输入完全时的英文长单词:
输入「intern」,前几个候选项应为「internal internet」,而不是「一那天二年」。
目前的问题:
目前的问题是这样的,输入完整的短单词权重低,输入不完整的长单词时第一候选项总是一个莫名其妙的中文。
权重设定
经过多次尝试,最后是给拼音和英文都设置一个权重来搞定的:
# 拼音
translator:
dictionary: pinyin_simp
initial_quality: x
# 英文
melt_eng:
dictionary: melt_eng
initial_quality: y
尝试过「不设置:-1」「不设置:0」「不设置:1」「1:0」「2:1」「3:2」「2:1.x」。。。
最后发现一个神奇的比例是 2 > x > y > 1。
使用了 1.2:1.1,各方面都比较合适,有点玄学😂。
重码问题
比如 can you she he size man,既是完整拼音,也是完整单词,在输入过该单词后,会有这样的问题:
如果不希望这样,可以直接在词库删掉重码的单词,或永远不输入这个单词,或手动 Fn+Shift+Del 降低权重。
但推荐直接在配置文件中禁用用户词典,因为英文方案不需要造词,自然也就不需要记录到用户词典;没有用户词典,就没有调频。
完整的参考配置
# pinyin_simp.schema.yaml
# 固顶字
custom_phrase:
dictionary: ""
user_dict: custom_phrase
db_class: stabledb
enable_completion: false
enable_sentence: false
initial_quality: 99 # 固顶字给予高权重
# 拼音翻译器
translator:
dictionary: pinyin_simp
preedit_format:
- xform/([nl])v/$1ü/
- xform/([nl])ue/$1üe/
- xform/([jqxy])v/$1u/
initial_quality: 1.2 # 拼音权重
# 英文翻译器
melt_eng:
dictionary: melt_eng
spelling_hints: 9
enable_sentence: false
enable_completion: true
enable_user_dict: false # 禁用用户词典
initial_quality: 1.1 # 英文权重
副作用
拼音的 initial_quality
大于 1 后,日期时间的 Lua 脚本 yield
的候选项会跑到最后面,输入 rq/sj 或 date/time 后,候选项处于最末端,date/time 还好,rq/sj 需要翻好多页。解决方法是在 yield()
前设置一个高权重:
- yield(Candidate("date", seg.start, seg._end, os.date("%Y-%m-%d"), ""))
+ local cand = Candidate("date", seg.start, seg._end, os.date("%Y-%m-%d"), "")
+ cand.quality = 100
+ yield(cand)
英文的 initial_quality
大于 1 后,我方案中的「v 模式」的候选项也跑到最后面了,输入「va」的候选项是「van vain …」,而不是「ā á ǎ à …」,也可以通过 Lua 脚本解决:
-- 在 engine/filters 下增加 - lua_filter@v_filter
-- 对 v+字母(例如 va、ve、vi、vo、vu) 的候选项重新排序
function v_filter(input, env)
local code = env.engine.context.input -- 当前编码
local l = {}
for cand in input:iter() do
-- 以 v 开头、2 个长度的编码、候选项为单个字符的,提到前面来。
if (string.len(code) == 2 and string.find(code, "v") == 1 and utf8.len(cand.text) == 1) then
yield(cand)
else
table.insert(l, cand)
end
end
for i, cand in ipairs(l) do
yield(cand)
end
end