Closed Lantaio closed 1 year ago
還是得在 processor 中 處理, 但是要在librime 中實現 不太容易, 要超前 ,如果是 一般的字根鍵 要在 speller 前攔下處理,須要先將 key push 到 context.input 暫時不要return 此時會蜀發Compose() 刷新 候選後, 再檢查 composition 是否要 commit() + accepted
正常 程序 中文模式 中文字根 輸入 前端 "a" -->engine --> processors (spelling 更新 context.input (此時會刷新) return accepted 結束
你的需求 可能要這麼作 前端 "a " --> engine--> processor lua_processor (在spelling 前)
if key.keycode >= 97 and key.keycode <= 97+25 then
context:push_input(key:repr() -- 此時會刷新
.........
if .....
commit
return accepted -- 直接commit 並 收下
elesif ...
return accepted --代替 spelling 收下
eles
context:pop_input(1)
return Noop -- 還原 不處理
end
十分感谢 @shewer 大神热心又详尽的回复。最近忙着折腾想实现的功能,所以今天才有空回复。我想实现的功能不是处理普通字母,不过没关系,一理通百理明。发这个帖子的目的主要有2个,1个就是想看看有没有人做过将候选项自动化/自动上屏的可行性尝试。2就是我在做这个尝试的时候发觉我之前的认识好像不对。原来以为yield
的时候就会出现候选窗口,但现在看来好像直到所有的filter组件都处理完之后才会最终生成候选窗口?如果是这样的话,那么即使是在processor阶段可以yield
,都只不过是在后台生成候选项。而且这样的话,如果我想在候选窗口弹出之后延时一段时间将默认候选上屏,好像就要按一下某个按键才可以触发新一轮的处理。否则有什么方法可以触发执行lua程序?
刚才在折腾的时候好像发现了新大陆!好像按1次按键其实是会触发2次事件的,按键被按下的时候触发1次,按键被释放时触发1次,两次事件是有区别的。那么如果想实现候选项自动上屏的话,可以在按键被按下时生成好候选项,处理完毕之后候选窗口会出来。然后在按键被释放的事件里处理延时和候选项上屏。这样就可以按1次按键搞定了。未尝试,先向大家提供这么一个信息。 哎呀,不过又想到这样的话,那么在按键a被释放事件正在执行延时任务的时候能否接收和处理按键b的事件呢?还是要尝试过才知道,高兴得太早了。
经测试,正如前面所说的,可以在按键a被按下事件生成候选项并弹出候选窗口,然后在按键a被释放事件执行延时和候选项上屏。不过Rime不能在这段等待时间接收和处理其它按键事件bcd,这些事件全部被排队挂起,要等a释放事件的延时和上屏程序执行完毕才会继续处理。这样又不符合我的期望,如果在等待期间可以同时接收和处理其它按键事件才有意义。
別忘了 硬體keyboard 長按的機制
aaaaaaaaa Release+a
librime 不支援 thread
比較可行的是 ipc rpc 轉發 messag 由其他app代理
多谢 @shewer 大神提供的思路。不过一来长按不符合通常的使用习惯,二来这个自动化功能只是尝试看看能否锦上添花,不是必须实现的功能,所以如果Rime不支持并行处理按键事件就不折腾了。由其它程序来实现对我这个小白来说鸭梨大了,哈哈。
如题,我尝试在某个lua_translator函数中
yield
了2个候选项,然后想实现延时一段时间后将当前候选项自动上屏的功能,但发觉不能在yield之后写这些代码,好像yield
命令不是立即出现候选框的,而是到整个按键处理流程结束(包括filter)才会出现候选框?不知道我的理解有没有错?有没有方法可以让候选框马上出现?