hchunhui / librime-lua

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

lua_translator 或者 lua_filter 如何绑定到 switcher 或 key_binder? #263

Open ChihSee-Hsie opened 1 year ago

ChihSee-Hsie commented 1 year ago

如题,虽然在这篇文档中提到「可以 env.engine.context:get_option("option_name") 方式綁定到 switch 開關/ key_binder 快捷鍵」,但具体将这条语句放在哪里、怎么放、option_name 用什么字段代换都没有给出实例。我对 lua 语言缺乏了解,一时也找不到可资参考的材料,所以在这里求助,希望方家给出一个实例,此致 祝安

shewer commented 1 year ago

context:get_option("ascii_mode") -- return bool context:set_option("ascii_mode", true) -- (string key, bool) 如果要找 librime component 調用開關有那些 可以 搜尋 librime/src 中 get_option

你可以看一下 librime src/rime/gear/ascii_composer.cc 中英文模式

ChihSee-Hsie commented 1 year ago

感谢指点。但我看过之后还是不太理解。这里的 context:get_option 放在 ascii_composer.cc 中,为 librime 提供了选项,那么在 lua 语言中,我要使用类似的语句,是应该在 rime.lua 中引用过对应的函数过后,再使用这一语句将它绑定到选项吗?如:

local charset = require("charset")
CJK = charset.CJK_filter
env.engine.context:get_option("CJK")

然后在指定的 yaml 文件之 switches 中加入名为 CJK 的选项?

shewer commented 1 year ago

https://github.com/hchunhui/librime-lua/wiki

ChihSee-Hsie commented 1 year ago

脚本开发指南中确实看到了有关的文档,但是自己写不出来。我一直不知道 env.engine.context:get_option("option_name") 这一语句的具体工作原理是什么,应该放在哪里——以 charset.lua 为例(脚本内容和 rime.lua 分开),应该放在 charset.lua 中,还是 rime.lua 中呢?

贴入直接相关的代码吧: lua/charset.lua

......
 local function CJK(input)
    -- 使用 `iter()` 遍历所有输入候选项
    for cand in input:iter() do
       -- 如果当前候选项 `cand` 不含 CJK 扩展汉字
       if (not exists(is_cjk_ext, cand.text))
       then
      -- 结果中仍保留此候选
      yield(cand)
       end
       --[[ 上述条件不满足时,当前的候选 `cand` 没有被 yield。
            因此过滤结果中将不含有该候选。
       --]]
    end
 end
......
return {CJK_filter = CJK}

rime.lua

local charset = require("charset")
CJK = charset.CJK_filter
env.engine.context:get_option("CJK")

xxx.custom.yaml


patch:
  switches:
    - name: CJK
      reset: 1
      states: ["UTF-8", "CJK"]

  engine/filters/@next:
    lua_filter@CJK
shewer commented 1 year ago

脚本开发指南中确实看到了有关的文档,但是自己写不出来。我一直不知道 env.engine.context:get_option("option_name") 这一语句的具体工作原理是什么,应该放在哪里——以 charset.lua 为例(脚本内容和 rime.lua 分开),应该放在 charset.lua 中,还是 rime.lua 中呢?

贴入直接相关的代码吧: lua/charset.lua


local function CJK(input)
-- 使用 `iter()` 遍历所有输入候选项
for cand in input:iter() do
--  JCK fileter enable 
if  ctx:get_option("CJK") then
-- 如果当前候选项 `cand` 不含 CJK 扩展汉字 ,送出候選
if not exists(is_cjk_ext, cand.text)   then
yield(cand)
end
else  --   bypass all candidates 
yield( cand)
end

end end

return {CJK_filter = CJK}


> 
> `rime.lua`
> 
> ```
> local charset = require("charset")
> CJK = charset.CJK_filter
> env.engine.context:get_option("CJK")
> ```
> 
> `xxx.custom.yaml`
> 
> ```
> patch:
>   switches:
>     - name: CJK
>       reset: 1
>       states: ["UTF-8", "CJK"]
> 
>   engine/filters/@next:
>     lua_filter@CJK
> ```
oniondelta commented 1 year ago

env.engine.context:get_option("option_name") 这一语句的具体工作原理是什么,应该放在哪里——以 charset.lua 为例(脚本内容和 rime.lua 分开),应该放在 charset.lua 中,还是 rime.lua 中呢?

应该放在 lua/charset.lua 中,还是 rime.lua 中呢? 兩個都可以,寫法不同,變化多多!

放在 charset.lua 中調取方式也有兩種! schema 中前面用「*」調取,不用另外在 rime.lua 寫 require 引用! https://github.com/hchunhui/librime-lua/wiki/Scripting#%E5%BC%95%E7%94%A8%E6%A8%A1%E5%9D%97

hoofcushion commented 1 year ago

schema.yaml

engine:
 filters:
+ - lua_filter@filter
switches
+ - {name: filter, reset: 0, states: ["关", "开"]}
`rime.lua`
```diff
+ require("filter")

lua/filter.lua

local opction_name
return{
 init=function(env)
  local name=env.name_space:match("^%*?(.*)$")
  opction_name=env.engine.schema.config:get_string(name.."/opction_name") or name
 end,
 tags_match=function(seg,env)
  return env.engine.context:get_option(opction_name)
 end,
 func=function(input,env)
  for cand in input:iter() do
  end
 end
}