hchunhui / librime-lua

Extending RIME with Lua scripts
BSD 3-Clause "New" or "Revised" License
357 stars 43 forks source link

请问目前librime-lua是否可以修改rime的option开关? #356

Closed tywtyw2002 closed 4 months ago

tywtyw2002 commented 4 months ago

traditionalizationascii_mode这样的开关。

我是想实现用指令来快速切换rime的模式。 比如说 vxxa 切换成繁体,全角,英文符号,emoji。 vxax 切换成纯英文模式,英文符号,emoji。 ...

mokapsing commented 4 months ago

可以,用set_option

https://github.com/hchunhui/librime-lua/wiki/Scripting#context

shewer commented 4 months ago

只要是使用 option 都可以 在 lua 中設定 實現的方法 可以用 lua_processor ( active_text = context.input + key_event( ascii code) , commit_notifier (使用 candidate ,把 cand.text 設成空字串 用comment 或是 type 操作)

tywtyw2002 commented 4 months ago

感谢。

tywtyw2002 commented 4 months ago

@shewer 在求教下

现在通过代码在translator模式下,可以做到 用vxxzx去设置输入法状态是ascii mode。 但是在输入vxxz时候出现候选选项("EN Mode")的时候,没法按回车键去切换,请问如何写code 才能实现按回车就可以执行这个功能呢。

local prefix = "vxxz"

local function do_translator(input, seg, env)
    selector = input:sub(5)

    if selector == "x" then
        env.engine.context:clear()
        env.engine.context:set_option("ascii_mode", 1)
    else
        yield(Candidate("qsnipx", seg.start, seg._end, "EN Mode", "x"))
    end

end

local function translator(input, seg, env)
    if  input:sub(1, 4) == prefix then
        return do_translator(input, seg, env)
    end
end

return translator
shewer commented 4 months ago

在一般情況下 space : commit candidate return : commit input 按下 return 應該是 commit context.input 的碼吧 如果只想要用 translator 而不用 processor ,可以試用 commit candidate + commit_notifier 方式 在commit 時 cand.text 是空字串,檢查 candidate.type 和解碼 cand.comment 字串執行命令

ex: candidate('cmd', seg._start, seg._end, '' , cmd_text) cand.quality 設定最高 字典table dict = { abc= { abcd , abcz,abcy}, abcd= cmd_text1, abcz=cmd_text2, abcy=cmd_text3}

local function get_dict_table( dict_name)
   -- load dict file  .....
   local dict = { 
    }
    return dict
end

local T={}
function T.init(env)
   env.quality=2.5
   env.dict = get_dict_table()
   env.commit_notyfier = env.engine.context.commit_notyfier:connect(function(ctx) 
      local cand=ctx:get_selected_candidate()
      if cand.type =="cmd" then
             excute(cand.comment)
       end
    end)
end
function T.fini(env)
    env.commit_notifier:disconnect()
end
local function get_candidates(input, seg,  env, cands)
    cands = cands or {}
    local res = env.dict[input]
    if type( res) == "string"
        local cand = Candidate('cmd', seg._start, seg._end, '', res)
         cand.quality = env.quality
         table.insert(cands, cand)
    elseif type(res) == "table" then
          for _,v in ipairs( res) do
               get_candidates(v, seg, env, cands)
           end
     end
     return cands
end
function T.func(input, seg, env)
      for _, cand in ipairs( get_candidates(input,seg, env) )
              yield(cand)
       end
end

return T
shewer commented 4 months ago

直接用T.func 遞迴, 省去 get_candidates

function T.func(input, seg, env)
   local res = env.dict[input]
   if type(res) == "string" then
        local cand = Candidate('cmd', seg._start, seg._end, '', res)
        cand.quality = env.quality
        yield(cand)
   elseif type(res) == "table" then
         for _,v in next, res do 
              T.func( v, seg, env)
         end
    end
end
tywtyw2002 commented 4 months ago

好的,感谢。 周末折腾以下