diff --git a/schema/lua/ace/os_tools.lua b/schema/lua/ace/os_tools.lua index f611a25..86d7d21 100644 --- a/schema/lua/ace/os_tools.lua +++ b/schema/lua/ace/os_tools.lua @@ -29,7 +29,11 @@ end local function preedit_lazy_clock_filter(input, env) if env.engine.context:get_option('preedit_lazy_clock') then for cand in input:iter() do - cand.preedit = cand.preedit .. ' ' .. os.date("%H:%M:%S") + if cand.preedit:find('\t') then + cand.preedit = cand.preedit .. ' ' .. os.date("%H:%M:%S") + else + cand.preedit = cand.preedit .. '\t' .. os.date("%H:%M:%S") + end yield(cand) end else diff --git a/schema/lua/ace/xuma_52p_precand.lua b/schema/lua/ace/xuma_52p_precand.lua index a279e8b..ef5ca8a 100644 --- a/schema/lua/ace/xuma_52p_precand.lua +++ b/schema/lua/ace/xuma_52p_precand.lua @@ -15,21 +15,24 @@ end local function filter(input, env) local context = env.engine.context - if context:get_option("xuma_52p_precand") then - local raw_inp = context.input - if raw_inp:find('%a$') then - raw_inp = raw_inp:match('%a+$') -- 去掉前置标点部分 + if context:get_option("xuma_52p_precand") and + context.caret_pos > 0 and + not context.input:find('^;') -- 本方案中分号引导用于实现其他多个功能 + then + local sel_inp = context.input:sub(1, context.caret_pos) + if sel_inp:find('%a$') then -- 一定要加这个判断,否则会影响符号键的功能 + sel_inp = sel_inp:match('%a+$') -- 去掉前置标点部分 end local detailed = context:get_option("detailed_x52_precand") local codes, cand1, cand2, seg1, seg2 - if raw_inp:len() < 3 then + if sel_inp:len() < 3 then if detailed then - codes = { raw_inp .. '_1', raw_inp .. '_2', raw_inp .. '_3' } + codes = { sel_inp .. '_1', sel_inp .. '_2', sel_inp .. '_3' } cand2 = map(codes, lookup(env.code2cand_rvdb)) end else - seg1 = raw_inp:sub(1, 2) - seg2 = raw_inp:sub(3) + seg1 = sel_inp:sub(1, 2) + seg2 = sel_inp:sub(3) cand1 = env.code2cand_rvdb:lookup(seg1 .. '_1') codes = { seg2 .. '_1', seg2 .. '_2', seg2 .. '_3' } cand2 = map(codes, lookup(env.code2cand_rvdb)) @@ -38,7 +41,7 @@ local function filter(input, env) for cand in input:iter() do if false then cand.preedit = cand.text - elseif raw_inp:len() < 3 then + elseif sel_inp:len() < 3 then if detailed then if cand2[1] == cand.text then cand.preedit = table.concat(cand2, '|') @@ -53,11 +56,12 @@ local function filter(input, env) -- cand.preedit = ('%s%s|%s'):format(cand1, cand2[1], cand.text) cand.preedit = ('%s+%s=%s'):format(cand1, table.concat(cand2, '|'), cand.text) -- cand.preedit = ('%s%s%s%s'):format( - -- cand1, raw_inp:sub(1,2), cand2[1], raw_inp:sub(3)) + -- cand1, sel_inp:sub(1,2), cand2[1], sel_inp:sub(3)) else cand.preedit = ('%s%s'):format(cand1, cand2[1]) end end + cand.preedit = cand.preedit .. '\t' yield(cand) end else diff --git a/schema/lua/ace/xuma_postpone_fullcode.lua b/schema/lua/ace/xuma_postpone_fullcode.lua index e128aeb..15fae3d 100644 --- a/schema/lua/ace/xuma_postpone_fullcode.lua +++ b/schema/lua/ace/xuma_postpone_fullcode.lua @@ -2,28 +2,29 @@ -- 出现重码时,将全码匹配且有简码的「单字」「适当」后置。 -- 目前的实现方式,原理适用于所有使用规则简码的形码方案。 +local radstr = '' +.. ' 一不了人之大上也子而生自其行十用发天方' +.. '日三小二心又长已月力文王西手工门身由儿入' +.. '己山曰世水立走女言马金口几气比白非夫未士' +.. '且目电八九七石车千干火臣广古早母乃亦示土' +.. '片音止食黑衣革巴户木米田毛永习耳雨皮甲凡' +.. '丁鱼牛申川鬼刀牙予骨末辛尤厂丰乌麻贝乙鸟' +.. '辰羊瓦虫尸鼻壬羽戊寸巳舟夕甫矛酉亥卜戈鼠' +.. '鹿弓瓜穴欠巾兀矢犬爪歹禾夭禺匕豕臼匚弋皿' +.. '缶髟钅攵幺卅艮耒隹殳攴長見風彡門貝車飛巛' +.. '馬魚齒頁鹵鳥丂丄丅丆丌丨丩丬丱丶丷丿乀乁' +.. '乂乚乛亅亠亻僉冂冊冎冖冫凵刂勹匸卄卌卝卩' +.. '厶吅囗夂夊宀屮巜廴廾彐彳忄戶扌朩氵氺灬為' +.. '烏爫爾爿牜犭疒癶礻糸糹纟罒耂艹虍衤覀訁讠' +.. '豸辶釒镸阝韋飠饣鬥黽' +.. '兀㐄㐅㔾䒑' + local function init(env) local config = env.engine.schema.config local code_rvdb = config:get_string('lua_reverse_db/code') env.code_rvdb = ReverseDb('build/' .. code_rvdb .. '.reverse.bin') env.his_inp = config:get_string('history/input') env.delimiter = config:get_string('speller/delimiter') - env.radstr = '' - .. ' 一不了人之大上也子而生自其行十用发天方' - .. '日三小二心又长已月力文王西手工门身由儿入' - .. '己山曰世水立走女言马金口几气比白非夫未士' - .. '且目电八九七石车千干火臣广古早母乃亦示土' - .. '片音止食黑衣革巴户木米田毛永习耳雨皮甲凡' - .. '丁鱼牛申川鬼刀牙予骨末辛尤厂丰乌麻贝乙鸟' - .. '辰羊瓦虫尸鼻壬羽戊寸巳舟夕甫矛酉亥卜戈鼠' - .. '鹿弓瓜穴欠巾兀矢犬爪歹禾夭禺匕豕臼匚弋皿' - .. '缶髟钅攵幺卅艮耒隹殳攴長見風彡門貝車飛巛' - .. '馬魚齒頁鹵鳥丂丄丅丆丌丨丩丬丱丶丷丿乀乁' - .. '乂乚乛亅亠亻僉冂冊冎冖冫凵刂勹匸卄卌卝卩' - .. '厶吅囗夂夊宀屮巜廴廾彐彳忄戶扌朩氵氺灬為' - .. '烏爫爾爿牜犭疒癶礻糸糹纟罒耂艹虍衤覀訁讠' - .. '豸辶釒镸阝韋飠饣鬥黽' - .. '兀㐄㐅㔾䒑' end local function get_short(codestr) @@ -35,7 +36,7 @@ local function get_short(codestr) end end -local function is_longer_and_full(cand, env) +local function has_short_and_is_full(cand, env) -- completion 和 sentence 类型不属于精确匹配,但不能仅用 cand.type 判断,因为 -- 可能被 simplifier 覆盖为 simplified 类型。先行判断 cand.type 并非必要,只是 -- 为了轻微的性能优势。 @@ -48,7 +49,7 @@ local function is_longer_and_full(cand, env) -- cand_input = cand_input:gsub('[ `\']', '') cand_input = cand_input:gsub('[' .. env.delimiter .. ']', '') -- 字根可能设置了特殊扩展码,不视作全码,不予后置。 - if cand_input:len() > 2 and env.radstr:find(cand.text, 1, true) then + if cand_input:len() > 2 and radstr:find(cand.text, 1, true) then return end -- history_translator 不后置。 @@ -79,11 +80,13 @@ local function filter(input, env) else -- 顶功方案使用 script_translator,没有 completion ,但会匹配部分输入, -- 如输入 otu 且光标在 u 后时会出现编码为 ot 的候选,需单独排除。不过通 - -- 过码表填满三码和四码的位置,就没有这个问题了。但是造句翻译器还是需要 + -- 过码表填满三码和四码的位置,就没有这个问题了。但是造词翻译器还是需要 -- 。 + -- 全角空格(U+3000)是顶功方案用来补空的候选,后置也不宜越过它。 local is_bad_script_cand = cand._end < context.caret_pos - local drop, is_comp = is_longer_and_full(cand, env) - if pos >= max_pos or is_bad_script_cand or is_comp then + local drop, is_comp = has_short_and_is_full(cand, env) + if pos >= max_pos + or is_bad_script_cand or is_comp or cand.text == ' ' then for i, cand in ipairs(dropped_cands) do yield(cand) end done_drop = true yield(cand) @@ -102,8 +105,6 @@ end return { init = init, func = filter } --[[ 测试例字: -一 原 gu -大 把 fd 和 舌 rov 中 喝 oku 我 箋 pffg @@ -111,11 +112,8 @@ return { init = init, func = filter } 在 黄土 hkjv 地 軐 jbe 是 鶗 kglu -上 肯 ls 道 单身汉 xtzd 以 (多个词组) cwuu -儿 (多个词组) ve -了 (多个词组) bl 同 同路 mgov 只 叭 otu --]] diff --git a/schema/lua/ace/xuma_spelling.lua b/schema/lua/ace/xuma_spelling.lua index 1a1eb79..bcd58e4 100644 --- a/schema/lua/ace/xuma_spelling.lua +++ b/schema/lua/ace/xuma_spelling.lua @@ -129,7 +129,7 @@ local function get_tricomment(cand, env) local code = env.code_rvdb:lookup(ctext) if code ~= '' then -- 按长度排列多个编码。 - code = matchstr(code, '%a+') + code = matchstr(code, '%S+') table.sort(code, function(i, j) return i:len() < j:len() end) code = table.concat(code, ' ') return '〔 ' .. spelling .. ' · ' .. code .. ' 〕'