hchunhui / librime-lua

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

如何用编码发送按键 #216

Open yawn0305 opened 1 year ago

yawn0305 commented 1 year ago

我想用zl来代替回车,打完zl之后跳到下一行,有方法能实现吗

yawn0305 commented 1 year ago

按照大佬们的零星经验,自己试着写了一段lua,但好像没用,不知道是哪里出了问题 function processor(key, env) local engine = env.engine local context = engine.context local input_text = env.engine.context.input if (input_text:find"zl")== 1 then context:clear() env.engine.process_key(Return) end end

shewer commented 1 year ago

env.engine:process_key(Return) -- Return = KeyEvent("Return")

shewer commented 1 year ago

按照大佬们的零星经验,自己试着写了一段lua,但好像没用,不知道是哪里出了问题

function processor(key, env) local Rejected,Accepted,Noop = 0,1,2 local engine = env.engine local context = engine.context -- local input_text = context.input if context.input:match("^zl") then -- (input_text:find"zl")== 1 then context:clear() env.engine:process_key( KeyEvent("Return") ) return 1 --Accepted end return 2 --Noop end

yawn0305 commented 1 year ago

按照大佬们的零星经验,自己试着写了一段lua,但好像没用,不知道是哪里出了问题

function processor(key, env) 
  local Rejected,Accepted,Noop = 0,1,2
  local engine = env.engine 
  local context = engine.context 
--  local input_text = context.input 
  if context.input:match("^zl") then    -- (input_text:find"zl")== 1 then 
       context:clear()
       env.engine:process_key( KeyEvent("Return") )
       return 1 --Accepted
   end 
   return 2 --Noop
end

好像还是不行啊,只能清屏,不能回车。 是因为我用的版本的原因吗 我用的是官网的0.14.3

oniondelta commented 1 year ago

KeyEvent 函數在官方下載的小狼毫中,好似 librime-lua 版本太舊不支持?! 這邊經驗是 mac 鼠鬚管以下運作正常

key:eq(KeyEvent("Shift+Return"))

後來移到 win 小狼毫卻不行且日誌報錯! 查一下報錯日誌,看看有沒有提示 KeyEvent 問題就知道!

shewer commented 1 year ago

可能
查看 wiki

shewer commented 1 year ago

KeyEvent 函數在官方下載的小狼毫中,好似 librime-lua 版本太舊不支持?! 這邊經驗是 mac 鼠鬚管以下運作正常

key:eq(KeyEvent("Shift+Return"))

後來移到 win 小狼毫卻不行且報錯! 查一下報錯日誌,看看有沒有提示 KeyEvent 問題就知道!

mac 版本有更新 librime-lua 2021/7 (可能是 #113 ) win 打包的安裝版 2020 ,要手動更換 rime.dll

oniondelta commented 1 year ago

這邊 win 小狼毫更換過 rime 官方編譯純 librime(rime.dll)過, 應該還是版本未滿 XD 需自行編譯或拿到更新版 rime.dll 有能力推薦自行編譯,把版本都編譯到最新

剛剛這邊給的key:repr("Release+Return")代碼經測試不可行XD engine:process_key(KeyEvent("Return")) 在 mac 鼠鬚管底下已編譯含最新 librime-lua 可行!

shewer commented 1 year ago

這邊 win 小狼毫更換過官方編譯純 librime(rime.dll)過, 應該還是版本未滿 XD 需要會自行編譯 rime.dll 有能力推薦自行編譯,把版本都編譯到最新

以下不是很確定,查之前試功能留下的代碼,改以下試試,不保證可行:

key:repr("Release+Return")

最新新版 CI 還沒砍 ( mac & win ) https://github.com/hchunhui/librime-lua/suites/9748346318/artifacts/467986280

yawn0305 commented 1 year ago

换了1.7.3内核的板本,运行日志没有发现KeyEvent报错,但还是不行 "Release+Return"、"Return"、"Shift+Return"都试了一遍,都不生效 头大

shewer commented 1 year ago
  if context.input:match("^zl") then
     context:clear()
     engine:commit_text("\n")
     return 1
   end
yawn0305 commented 1 year ago
  if context.input:match("^zl") then
     context:clear()
     engine:commit_text("\n")
     return 1
   end

大佬牛的,改成\r可以实现换行了 虽说方法折中,但总算是实现了

oniondelta commented 1 year ago

send_sequence: https://www.zhihu.com/question/27121962/answer/820366880

方法解法千變萬化! 慢慢玩耐心試吧!

shewer commented 1 year ago

請觸發 return 後再看日誌!

engine:press_key()  等同遞歸函式
bool engine->process_key(key)   -- 大腸包小腸
int processors -->ProcessKeyEvent(key)  -- 小腸包大腸
bool engine->process_key( f_key)

只能用在會可被 processors accepted 的key Noop Rejected 都有失控的風險 且必須小心用 很是麻煩

https://github.com/rime/librime/blob/9086de3dd802d20f1366b3080c16e2eedede0584/src/rime/engine.cc#L96-L115

oniondelta commented 1 year ago

之前錯碼試 engine:process_key("Right") 就造成鼠鬚管程式崩潰! 然後重開機再改回來,即可XD 的確必須要小心!

後來的作法是改走原生 rime 中的 key_binder 去達成想要的功能!

lotem commented 1 year ago

這是在折騰啥? Rime不能向系統發送按鍵,只能輸出文字。

yawn0305 commented 1 year ago

这是在折腾啥? Rime不能向系统发送按键,只能输出文字。

mac可以用lua实现,win不行,win用户感觉很受伤

shewer commented 1 year ago

這是在折騰啥? Rime不能向系統發送按鍵,只能輸出文字。

有沒有考慮加上 Engine::CommitKeys(vector ) 給前端

oniondelta commented 1 year ago

mac可以用lua实现,win不行,win用户感觉很受伤

librime-lua 版本問題換 rime.dll 理應可以解決?! 不知你是換上面 shewer 大大提供的連結嗎? 換完後有重開機和重新部署嗎? 另外 librime 版本 和 librime-lua 版本 是兩回事! 兩個同樣 librime 1.7.3 内核,librime-lua 版本不一定一樣!

https://github.com/hchunhui/librime-lua/suites/9748346318/artifacts/467986280

yawn0305 commented 1 year ago

mac可以用lua实现,win不行,win用户感觉很受伤

librime-lua 版本問題換 rime.dll 理應可以解決?! 不知你是換上面 shewer 大大提供的連結嗎? 換完後有重開機和重新部署嗎? 另外 librime 版本 和 librime-lua 版本 是兩回事! 兩個同樣 librime 1.7.3 内核,librime-lua 版本不一定一樣!

https://github.com/hchunhui/librime-lua/suites/9748346318/artifacts/467986280

我不会编译,用的是https://github.com/fxliang/weasel和其他几个编译好的版本,据说是已经用上最新的hchunhui/librime-lua,但都没用,只好作罢 至于部署问题,我是KeyEvent("Return") 部署无较后,再换成commit_text("1")再部署测试,而KeyEvent不能实现,commit_text能实现,所以程序运行应该是正常的,应该跟重新开机和部署没关系

yawn0305 commented 1 year ago

mac可以用lua实现,win不行,win用户感觉很受伤

librime-lua 版本问题换 rime.dll 理应可以解决?! 不知你是换上面 shewer 大大提供的连结吗? 换完后有重开机和重新部署吗? 另外 librime 版本 和 librime-lua 版本 是两回事! 两个同样 librime 1.7.3 内核,librime-lua 版本不一定一样!

https://github.com/hchunhui/librime-lua/suites/9748346318/artifacts/467986280

用链接里的rime.dll 替换了,再测试了一遍,还是不行

lotem commented 1 year ago

這是在折騰啥? Rime不能向系統發送按鍵,只能輸出文字。

有沒有考慮加上 Engine::CommitKeys(vector ) 給前端

輸入法的API沒有這種能力。 如果寫成外掛程序,那也沒必要通過Rime實現,可以在一個插件裏直接發系統調用。這樣一來,程序的權限要比正經的輸入法高。

oniondelta commented 1 year ago

用链接里的rime.dll 替换了,再测试了一遍,还是不行

shewer 大大用 win 小狼毫,問他看看好了 這邊主用 mac 鼠鬚管 但之前確實更過小狼毫的 rime.dll,使 librime-lua 增加那時新版功能過!

https://github.com/fxliang/weasel 應該不是官方版吧?!新改新增外觀候選框可圓弧,但 librime 核心還是三年前的

shewer commented 1 year ago

用链接里的rime.dll 替换了,再测试了一遍,还是不行

shewer 大大用 win 小狼毫,問他看看好了 這邊主用 mac 鼠鬚管 但之前確實更過小狼毫的 rime.dll,使 librime-lua 增加那時新版功能過!

https://github.com/fxliang/weasel 應該不是官方版吧?!新改新增外觀候選框可圓弧,但 librime 核心還是三年前的

改用fcitx5 了 win10 放在硬碟裡備著沒在用 :)

oniondelta commented 1 year ago

哎哀欸! Win 小狼毫置換 rime.dll 親測可行! 可使 env.engine:process_key(KeyEvent("Return")) 作用

Win10,Rime官方編譯版 更換 shewer 大大提供的核心 librime 連結

置換好後,功能還是舊版本! 『請重新開機』!!! 就會變成新核心和 librime-lua!

螢幕擷取畫面 2022-12-19 235828

yawn0305 commented 1 year ago

哎哀诶! Win 小狼毫置换 rime.dll 亲测可行! 可使 env.engine:process_key(KeyEvent("Return")) 作用

Win10,Rime官方编译版 更换 shewer 大大提供的核心 librime 连结

置换好后,功能还是旧版本! 『请重新开机』!!! 就会变成新核心和 librime-lua!

萤幕撷取画面 2022-12-19 235828

照你说的重新又替换了一次,重新开机了,还是不行

yawn0305 commented 1 year ago

我的lua是按照shewer大大指导写的,应该没问题吧 engine:commit_text("\r") 能用, env.engine:process_key(KeyEvent("Return")) 用不了 QQ截图20221220012134

shewer commented 1 year ago

我猜是 processors 都不處理 not composing + Return 吧 commit_text 可以在不增加複雜度下完成工作就用吧. 用process_key() 只會增加複雜度和不可控。

要找出在空字串時按下"Return" 是那個processor (Noop Reject ) 這和每個人的方案 engine/processors 排列組合求不一樣都會產生不一樣的結果 檢查process_key() 返回值看看

if context.input:match("^zl") then
  context:clear()
  local res = env.engine:process_key(KeyEvent("Return"))
  env.engine:commit_text( res and "-true\r" or "-false\r")
   return 1
end
shewer commented 1 year ago

如果寫成外掛程序,那也沒必要通過Rime實現,可以在一個插件裏直接發系統調用。這樣一來,程序的權限要比正經的輸入法高。

我的想法 是增加一個 類似 using CommitSink = signal<void (const string& commit_text)>; using CommitKeys= singnal<void(const vector &keycodes);

給前端 應用

yawn0305 commented 1 year ago

我猜是 processors 都不处理 not composing + Return 吧 commit_text 可以在不增加复杂度下完成工作就用吧. 用process_key() 只会增加复杂度和不可控。

要找出在空字串时按下"Return" 是那个processor (Noop Reject ) 这和每个人的方案 engine/processors 排列组合求不一样都会产生不一样的结果 检查process_key() 返回值看看

if context.input:match("^zl") then
  context:clear()
  local res = env.engine:process_key(KeyEvent("Return"))
  env.engine:commit_text( res and "-true\r" or "-false\r")
   return 1
end

返回-false

oniondelta commented 1 year ago

把 context:clear() 去掉 engine:process_key(KeyEvent("Return")) 能作用 就代表 librime-lua 版本有升上去! 但兩個加在一起無法處理,如 shewer 說的

請一步一步試吧!

engine:commit_text('\r')或 engine:commit_text('\n') 可以用就用吧! 不過在某些軟體上,如:mac 版 sublime,不吃 \r 或 \n

yawn0305 commented 1 year ago

把 context:clear() 去掉 engine:process_key(KeyEvent("Return")) 能作用 就代表 librime-lua 版本有升上去! 但两个加在一起有冲突无法处理,如 shewer 说的

请一步一步试吧!

engine:commit_text('\r')或 engine:commit_text('\n') 可以用就用吧! 不过在某些软体上,如:mac 版 sublime,不吃 \r 或 \n

试了一下,去掉context:clear()后,env.engine:process_key( KeyEvent("Return") )就能生效了 说明版本应该是没问题了 看来就是 shewer 说的,not composing状态无法使用

shewer commented 1 year ago

你那是剛好 , engine/processors 的組合排列都會有不同 的結果 拿到別的方案用不一定行。 重點還是 engine:process_key(KeyEvent("Return")) 被那個 processor 處理了( accepted rejected noop) 。

還要檢查log是不是 error 中斷 造成的結果

以上面的script input :"zl" engine->process_key( anykey) -- 井沒有把當下key 加入 input (啥key 都可以)
zla zlb zl\s zl\n zl{Contron-n} ......

  1. input: "zl" --> engine->process_key(KeyEvent("Return"))
  2. input: "" --> engine->process_key(KeyEvent("Return"))

別忘了 原作者的重點 librime 只能處理 text , 功能鍵都是處理librime環境下的機制 "F4" accepted 打開 switches menu

"F4" rejected 退回"F4" 前端處理 真的user按下的"F4" "F4" noop ->unhandle_key 同上

https://github.com/rime/librime/blob/9086de3dd802d20f1366b3080c16e2eedede0584/src/rime/engine.cc#L96-L115

yawn0305 commented 1 year ago

你那是剛好 , engine/processors 的組合排列都會有不同 的結果 拿到別的方案用不一定行。 重點還是 engine:process_key(KeyEvent("Return")) 被那個 processor 處理了 還要檢查log是不是 error 中斷 造成的結果

E20221220 15:10:00.609894 11008 lua_gears.cc:193] LuaProcessor::ProcessKeyEvent of Return error(2): D:\Rime\lua\Return.lua:8: C stack overflow 刚看了一下日志,人又晕了

shewer commented 1 year ago

你那是剛好 , engine/processors 的組合排列都會有不同 的結果 拿到別的方案用不一定行。 重點還是 engine:process_key(KeyEvent("Return")) 被那個 processor 處理了 還要檢查log是不是 error 中斷 造成的結果

E20221220 15:10:00.609894 11008 lua_gears.cc:193] LuaProcessor::ProcessKeyEvent of Return error(2): D:\Rime\lua\Return.lua:8: C stack overflow 刚看了一下日志,人又晕了

process_key() 進入infinite loop