-- 以词定字 -- 来源 https://github.com/BlindingDark/rime-lua-select-character -- 删除了默认按键 [ ],和方括号翻页冲突,需要在 key_binder 下指定才能生效 -- 20230526195910 不再错误地获取commit_text,而是直接获取get_selected_candidate().text。 local function utf8_sub(s, i, j) i = i or 1 j = j or -1 if i < 1 or j < 1 then local n = utf8.len(s) if not n then return nil end if i < 0 then i = n + 1 + i end if j < 0 then j = n + 1 + j end if i < 0 then i = 1 elseif i > n then i = n end if j < 0 then j = 1 elseif j > n then j = n end end if j < i then return "" end i = utf8.offset(s, i) j = utf8.offset(s, j + 1) if i and j then return s:sub(i, j - 1) elseif i then return s:sub(i) else return "" end end local function select_character(key, env) local engine = env.engine local context = engine.context local commit_text = context:get_commit_text() local config = engine.schema.config -- local first_key = config:get_string('key_binder/select_first_character') or 'bracketleft' -- local last_key = config:get_string('key_binder/select_last_character') or 'bracketright' local first_key = config:get_string('key_binder/select_first_character') local last_key = config:get_string('key_binder/select_last_character') if context:has_menu() then if (key:repr() == first_key) then if (context:get_selected_candidate().text) then engine:commit_text(utf8_sub(context:get_selected_candidate().text, 1, 1)) context:clear() end return 1 -- kAccepted elseif (key:repr() == last_key) then if (context:get_selected_candidate().text) then engine:commit_text(utf8_sub(context:get_selected_candidate().text, -1, -1)) context:clear() end return 1 -- kAccepted end end return 2 -- kNoop end return select_character