rime / librime

Rime Input Method Engine, the core library
https://rime.im
BSD 3-Clause "New" or "Revised" License
3.37k stars 551 forks source link

接口请求:操纵输入框,包括回删、选择周围、获取选择的内容 #614

Closed bczhc closed 1 day ago

bczhc commented 1 year ago

原始rime-lua issue:https://github.com/hchunhui/librime-lua/issues/227

看到说librime必须有相应的接口,lua扩展那边才能相应添加lua的接口,所以就来这接口请求了。比如,像是安卓中的InputConnection#getSurroundingText InputConnection#getSelectedTextInputConnection#deleteSurroundingText

感谢

LEOYoon-Tsaw commented 1 year ago

這種明顯前端才有的東西,librime怎麼可能拿得到

bczhc commented 1 year ago

不可以在librime中留有接口,然后发给前端去请求么。我感觉这个可能就像是librime配置中的style,只是个配置定义,会给到前端去实现样式。可如果真不行的话,librime-lua也就没办法了嘛?

bczhc commented 1 year ago

其实我也还不太懂librime到底是处理什么的。我看到librime中引入X11,处理按键事件,那这些接口应也是有相应X11接口,librime就不可处理吗?单纯想了解一下,请教一下。

更新:哦哦,似乎librime中的X11只是用到key def之类的?

mokapsing commented 1 year ago

我的本意是告诉你,这些是由前端完成的功能,librime只负责将从前端收到的key转成码表里的字,返给前端,你应该向小狼毫提这个请求,虽然不一定会有开发做

bczhc commented 1 year ago

@mokapsing 我明白最终的平台实现肯定在前端。可光前端有功能了是不是仅仅不够,librime没任何接口与其通讯,而且要这么搞的话,各平台(比如小狼毫、fcitx5-rime)接口怎么统一?。比如我想实现从librime-lua中操纵输入框,光前端有功能的话这怎么调用到呢,我觉得应该是librime-lua得调用librime,librime再通知前端?

mokapsing commented 1 year ago

librime需要干什么?

bczhc commented 1 year ago

具体我也不知道也不确定啊,而且我也不是在什么设计/代码层面提想法,单纯就是一个使用者的角度来。那按你这么说,反正不管怎样,那是不是在lua扩展中做这些操作就变得不可能了?

shewer commented 1 year ago

傳遞 KeyEvent repr() 字串 到前端處理 可用 commit_text 或 property_notifier commit_text("(){Left}")

bczhc commented 1 day ago

我的想法是,librime中统一一套这样的接口,前端可以来平台实现,然后lua中使用那些接口,就会请求到相应的前端实现。(原谅我之前糟糕的语气……)

有一个应该可行的解决方案,我在并击输入法群里看到有人用rime-lua链接本地库,实现直接在lua里调c接口。这样就使librime-lua中做这些操作成为可能,只需给它搞个平台相应的动态库就行了,并且能干的事会很多,比如调微软的SAPI TTS。比如针对这个issue,在安卓中,我可以有如下调用:

Rime lua--(c bind)-->libwhatever.so--(JNI API)-->`InputConnection#getSurroundingText`。
bczhc commented 1 day ago

傳遞 KeyEvent repr() 字串 到前端處理 可用 commit_text 或 property_notifier commit_text("(){Left}")

这个我试了,只会上屏(){Left}而不是操作光标向左移。刚好别的项目有个配对括号需求,可以看一下,这是我目前的理解,不知对不对。

我同样试了在lua中

engine:process_key(KeyEvent(0xff51 /* XK_Left */, 0))

但这种等于说只是对librime的内部发个左键,就比如我说到的composing时左移个caret,而不能操作系统的光标向左移。

mokapsing commented 1 day ago

傳遞 KeyEvent repr() 字串 到前端處理 可用 commit_text 或 property_notifier commit_text("(){Left}")

这个我试了,只会上屏(){Left}而不是操作光标向左移。刚好别的项目有个配对括号需求,可以看一下,这是我目前的理解,不知对不对。

我同样试了在lua中

engine:process_key(KeyEvent(0xff51 /* XK_Left */, 0))

但这种等于说只是对librime的内部发个左键,就比如我说到的composing时左移个caret,而不能操作系统的光标向左移。

说了那么多还是没明白,lua发的键都给librime了,librime只是个后端,还隔着个前端,这个得前端支持才行

bczhc commented 1 day ago

明白明白,这正是我现在的理解,看我对另一个issue下的解释,应该没问题。Rime只作为一个后端。