在 Rime 中输入英文

easy_en 方案挂载到自己的主输入方案(全拼、双拼、五笔等),就可以同时输入英文单词。

我用的是 melt_eng 方案,差不多,我觉得这个更舒服,支持大小写同时响应。

示例:

# 在主方案配置文件,如 pinyin_simp 或 luna_pinyin
# ...
schema:
  dependencies:
    - melt_eng
# ...
engine:
  translators:
    - [email protected]_eng
# ...
melt_eng:
  dictionary: melt_eng

这样挂载了英文方案与英文词库,在拼音方案下就可以输入英文单词。

期望的行为:

  • 拼音优先

输入「ma」,前几个候选项应为「吗 嘛 马」,而不是「Mac mad man」。

  • 重码时拼音优先

  • 短单词优先

输入「mac」「shit」「app」,第一候选项应为「Mac」「shit」「App」,而不是「马车」「试听」「挨批评」。

  • 未输入完全时的英文长单词:

输入「intern」,前几个候选项应为「internal internet」,而不是「一那天二年」。

权重设定

目前的问题是这样的,短单词权重低,长单词时第一候选项总是一个莫名其妙的中文。

2022-05-11-000708

经过多次尝试,最后是给拼音和英文都设置一个权重来搞定的:

拼音
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,各方面都比较合适,有点玄学😂。

2022-05-11-000717

重码问题

比如 can you she he size man,既是完整拼音,也是完整单词,在输入过该单词后,会有这样的问题:

2022-05-10-000693

如果不希望这样,可以直接在词库删掉重码的单词,或永远不输入这个单词,

或在配置文件中禁用用户词典,因为英文方案不需要造词,自然也就不需要记录到用户词典;没有用户词典,就没有调频。

完整的参考配置

参考配置仓库:iDvel/rime-settings

# 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)

「v 模式」的候选项也跑到最后面了,输入「va」的候选项是「van vain …」,而不是「ā á ǎ à …」,也得通过 lua 脚本解决:

-- 不知道这个方法为什么不行啊???
-- function v_single_char_first_filter(input, seg)
--     if (string.find(input, "v") == 1 and string.len(input) == 2) then
--         local l = {}
--         for cand in input:iter() do
--             if (utf8.len(cand.text) == 1) then
--                 yield(cand)
--             else
--                 table.insert(l, cand)
--             end
--         end
--         for cand in ipairs(l) do
--             yield(cand)
--         end
--     end
-- end
--
-- 反正是解决了,不知道怎么就解决了,就是最后多一个候选项,没多大影响。
function v_single_char_first_filter(input, seg)
	if (string.find(input, "v") == 1 and string.len(input) == 2) then
			yield(Candidate("", seg.start, seg._end, "", ""))
	end
end