-
Notifications
You must be signed in to change notification settings - Fork 573
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
加入 Lua 脚本扩展支持 #248
Comments
嘿,不錯喲。 關於 librime 的插件,目前有這個: 這裏 有個CMake選項可以把 |
是个狼灭 |
赞同做成插件。我之前以为 librime 还没法支持插件呢。 插件是在运行时加载进去吗?它与主体的接口有哪些呢? |
插件的功能是在一個獨立的編譯單元裏往中心註冊組件( 使用者(如 後話:只不過在Windows上動態鏈接庫不一定好使,如果靜態鏈接插件還要改動一些工程配置,插件化的倒退,比如這裏所做的。 |
可以先发个 PR 然后在 PR 串里讨论。 |
另外不考虑使用 |
@lotem 谢谢,我先研究一下插件。 @nameoverflow 谢谢。 |
@hchunhui 虛擬機是不是可以在某個組件(如 Translator)實例的構造函數裏面初始化, |
@lotem 多谢指导!我按照前面的提示修改了代码,理论上可以独立出来了。 我理解的插件,应该是:
具体到 rime 来说,第一点是由 librime 头文件形成的接口和它 Module 系统共同实现的。 我用的是 fcitx-rime,我粗略看了一下并没有找到加载动态库的功能。 我的理解对吗? |
@hchunhui 同意以上分析。 |
刚看到,有用,标记一下 |
missing: PKG_CONFIG_EXECUTABLE ,导致无法在win下编译通过: CMake Error at C:/Program Files/CMake/share/cmake-3.13/Modules/FindPackageHandleStandardArgs.cmake:137 (message): |
谢谢反馈。看错误是没有找到 lua 库。 我对 windows 不太熟悉,为了方便我直接把 lua 放进仓库了,不用再依赖外部 lua 库。 现在这版代码处于弃用状态,仅供试用。 按前面的讨论,我开了一个新的仓库,目标是做成 librime 的插件: https://github.com/hchunhui/librime-lua 后续的开发会在新仓库中。 |
修改过的代码依然不能在win下编译通过,完整的编译信息在这里 。 |
似乎是 VC 的 bug: 我按照这里面方法改了一下,再帮忙试试? |
已经成功编译出 「rime.dll」 但是,看到了的 LUA 脚本中有一些预定义的函数,那么,能不能多写几组具体功能实现的调用示例?比如,「单字过滤」的功能,能写个示例吗? |
比如,LUA 脚本中有已经定义好的:
那么,在 schema 中引用「- lua_filter@single_char_filter」,还是另写新的调用函数? |
直接用「- lua_filter@single_char_filter」即可。 仓库里面的 rime.lua 中每个注释起头的小节都是一个例子。 仓库中 rime.lua 只是参考,自己完全可以从头开始写,不必保留里面的任何内容。 |
请验证一下 「 single_char_filter 」的可用性,我和两个小伙伴都验证无效,不能实现「屏蔽候选条目中的词组」的效果,只能做到「词组后置」 |
“词组后置”是期望的行为,抱歉名字起得有点误导。 这里的 single_char_filter 函数对应实现的就是 librime 自带的 single_char_filter: 这个例子的原意是供人对比 lua 和 C++ 的实现,进而说明用 lua 加上"yield"编程模型更为简易且有性能保证。 「屏蔽候选条目中的词组」的效果,可如下实现:
|
非常感谢,成功啦。 |
是的,现在无法实现所需的功能。 解决这个问题需要在 lua 中绑定 context 相关的函数,让 filter 能够根据 context 做不同操作。 |
嗯,那期待插件版的新版本吧。 |
今天为 filter 和 translator 加上了环境,绑定了 context 相关函数。
get_option 中的字符串可换为其他的开关名字,不一定与函数名相同。 还有些新增功能有空再总结。 Windows 编译版: |
非常感谢,用上了,Lua灵活强大性能好,感觉可以实现很多功能。 但是有一个问题, 咱们 Lua 开关实现的功能也好,内置 Librime 对象实现的功能也好, 由「switches开关」和「快捷方式」调用时——受到 Librime 的逻辑设定 它们都是「临时有效,且仅对当前程序临时有效」, 于是:「字符集切换」和「候选过滤」(比如楼上实现的「单字模式」),都仅是临时生效的,光标焦点换个程序——还得从头开一次。 诚然,我们可以打开 「XXX.schema.yaml」用一次改一次,但这样太低效了。 比如这个→ ISSUES 中提到的,「 Switches开关 」和「快捷键」调用相应功能的「生效范围」: 如果是「全局生效」,就不用担心输入法从 Chrome 换到 Office 时,上一分钟做过的「设定」失效的问题。 不知大神可有简便的方式,对 Librime 的这个逻辑做个修改。 |
我没有遇到这样的问题。 是不是你的 schema 配置有问题? |
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
未来,生手可以通过 「Switche」 可以获得可视化的设定菜单,熟手可以通过「快捷键」更加迅速地变更各自熟悉的,高频用到的功能细节,Lua扩展的实现,又可观地扩大了关于功能拓展的空间。比如上面用 GIF 演示的一些功能的实现。「Switches开关」和「快捷键」,这两个能即时修改librime的「扳手」,被限定为「临时有效」,太不合理了啊。 |
此问题已超出本主题范围,建议另开新主题。 在新主题中,我认为您需要描述一下在不要 reset 项时与您的期望的差别在什么地方。 |
你好,目前在Android手机上使用一个基于同文开发的测试版本,开发者是@nirenr 同样支持lua脚本 个人经常有这样的需要,如编程中输出长串英语单词时,有时候需要变形,比如book->Book以及后面自动加空格 |
谢谢关注。上述功能现在应该已经可以做到。现在说明文档暂缺,若有兴趣做我们可以继续交流细节。 我从 librime-lua 能做的事和需求本身两方面来说明一下。
|
其實 |
是的。我也发现 感觉 librime-lua 想做得好用,还需要好好把接口整理一遍。
|
@hchunhui 谢谢你的解答,目前电脑端在用编译出来的lua版本小狼毫,手机端也在制作一些有意思的脚本 目前提出的想法是能不能在rime中提供基于热键的lua脚本。不是作为功能函数的开关,而是按下一次热键执行一次脚本函数。 按键设置方式推荐如下 目前的脚本运作方式是当候选中出现相关关键字或出现指定编码时自动运行脚本,是一种被动式的,同时也是批量式的运作。 比如默认的空格键执行的功能是上屏选中候选内容。我的想法是将lua脚本功能和指定热键绑定,比如针对选中单个候选对象进行操作。也就是在上屏的过程中将准备上屏内容传递到lua脚本进行处理,返回处理后内容,或执行其它功能后取消上屏 适用于执行一些额外的功能,让同文的按键操作功能变得更高效。 |
此类功能,以 “Control+v 转大写,加空格” 为例,大概像如下实现:
在 schema 的 processors 中加入:
即可。 上述实现中,触发按键和执行动作是写死在代码中的。 |
好的,收到 下面这是一个网络请求,返回json内容,是一个拼音云结果,在同文里面已经可以实现了,目前小狼毫lua脚本支持吗 因为有的时候需要通过网络获取内容,可否通过lua脚本实现,直接在小狼毫里面上屏 |
编译好的 rime.dll 可以在 https://github.com/hchunhui/librime-lua/releases 找到。 云输入暂时做不了。主要问题是 librime 目前好像还做不到异步,在 translator 里面直接请求网络会塞死整个输入法。要做的话,也许要先动 librime 的代码(也许前端也要改?),然后再在 lua 层面上支持。 |
@hchunhui 不要等網絡請求。本地結果應迅速展示,異步結果可以由前端發送無動作按鍵輪詢。或者利用提前請求得到的匹配結果。 |
我覺得除了不帶插件的版本,再構建一個集成所有插件的版本。 現有配置下,阻礙插件動態加載的,還有一個內存管理問題。 |
@lotem 集成所有插件的自动构建,我觉得是不是可以建一个专门的 build 仓库,里面以 submodule 的形式引用各插件和 librime 的代码,像这样:
构建脚本先把各插件移动到 plugins 目录下,然后再调用正常的流程。 另外可以考虑给 cmake 加一个选项,让 cmake 除了在 plugins 目录以外,可以搜索指定目录下的插件,这样就可以免去“移动”这一步。 |
定义了一些直接上屏的快符 开启此脚本后,
|
大家好!我对为 librime 加入脚本扩展的议题很感兴趣。
可惜我看到之前关于此的讨论一直没有后续进展。
我花了几周做了一个原型,期望一起讨论,最终将该功能合并到 librime 中。
我的分支在: https://github.com/hchunhui/librime/tree/lua-dev
下面是具体方案使用和编译的说明。欢迎大家试用和提意见!
背景:
librime 内部实现了一系列可组合的输入法模块,
用户通过 yaml 配置文件选择模块,并组合成所需的输入引擎。
然而现有的内置模块不能满足多样化的需求。
如字符集过滤,内置模块 charset_filter 只能过滤特定的字符集,
若用户要过滤其他的字符,除修改 librime 代码,没有直接的办法。
但 librime 为了通用性,不可能接受这些特定用途的修改。
类似需求还有候选排序、输入日期、输入大写数字等。
方案:
为 librime 引入脚本,将实现可变和多样功能的代码移出内核,让用户自行定义。
目前提供用脚本扩展新的 filter 和 translator。
使用说明:
目前实现了 lua_filter 和 lua_translator,
分别对应 rime 中的 filter 和 translator,可插入配置文件中。
如:
myfilter 和 mytranslator 分别表示实现对应功能的函数在 lua 脚本中的名字。
lua_translator 和 lua_filter 也可以有多个实例。
目前 lua 脚本文件名是在代码中写死的,是 rime 的配置目录下的 "rime.lua" 文件。
在源码树 "data/lua/" 中有一脚本样例,可用于试用和参考。
下面以用 lua 实现字符过滤和输入日期为例,说明脚本的写法。
根据配置,lua_filter, lua_translator 分别会激活 myfilter, mytranslator 来执行字符过滤功能。
myfilter 的输入输出均可看作候选项 candidate 组成的列表。
myfilter 首先对输入进行遍历,然后逐一检查候选项是否保留(filter_cond实现略)。
若是,则输出。这里采用了 yield 逐一按序输出每项候选,而不是返回整个候选列表。
这样写的目的是实现按需计算,避免因计算没被用户翻页看到的候选而浪费时间和空间。
mytranslator 的输入是由 segmentor 切分好的输入子串 input 和分段 seg,输出是候选项列表。
首先判断输入是否为 "/date",若是则生成一个当前日期的候选。
编译说明
需要事先安装 lua5.3 的开发包,其余同 librime。
The text was updated successfully, but these errors were encountered: