Rubick 插件学习笔记
本来有好多想实现的玩意儿,代码片段收藏,commander,定时任务,草图绘制工具,但热情消退了,懒了,均不想干。但考虑还是做个色彩识别游戏,后续搬到 rubick 上……也想做个图片收藏工具,去创建一个置顶的窗口,通过拖放图像以达到收藏的目的,这种方法我觉得通用性是最广的,但目前没啥兴趣做。
这玩意好是好,但文档缺失,bug 不少,开发者是跑路了吗?但确实好用,玩法太多了,值得做点笔记,把它当作主力的生产力工具……
描述一下插件的环境搭建和开发,一些文档中没写清楚的概念的使用,以及一些实际案例。这里仍旧使用我比较习惯的 vite + ts + react。
这里假设插件是写给个人用的,不考虑打包和分发等因素,而是需要自己利用 npm 去安装依赖和编译,让 nodejs 自己去找依赖,但这可能需要调整 electron 等的版本,避免多版本的 electron 共存导致问题。如果要打包和分发的话,不止前端代码,预加载脚本和系统插件代码也考虑用打包工具如 webpack 处理一下来避免依赖问题。
个人插件的项目地址见此 https://github.com/V-YOP/rubick-ykihelper,可以以其项目结构作为模板去进行开发;该项目中提供了 rubick 预先提供的 API 的 ts 定义,以及一些额外的自定义的功能及其定义,见preload/preload.ts
和/preload/rubick.ts
。
概念
Rubick 是 Electron 应用,以 npm 包的形式去导入插件。插件分为系统插件和 UI 插件(但一个插件可以同时为系统插件和 UI 插件,pluginType 需要设为 system,后面就这么操作)。系统插件随 rubick 启动,UI 插件在每次打开插件对应页面时启动。系统插件能做 Electron 主进程能做的一切事情,而 UI 插件主要是一个预加载脚本,活在 Electron 的渲染进程中。
系统插件在 rubick 启动后被自动加载,系统插件需 eport 一个函数,该函数返回一个() => {onReady: (ctx) => void}
,rubick 会自动调用这里的 onReady 函数。ctx 无关紧要——它都是 electron 中提供的 API,可以自己 import。
注意系统插件逻辑中如果抛出异常会直接阻止 rubick 启动,此时必须通过任务管理器强制关闭 rubick,因此妥善处理异常是必须的。
添加外部依赖
系统插件代码和预加载脚本中均能够使用第三方的 npm 库,只要保证该库存在于文件祖先路径中的 node_modules 中即可。
package.json / features
features 有六种:text, over, img, regex, file, img, window。其中 file 和 window 没研究出来怎么用,得后面翻源代码。
注意每次修改 features 后需要在开发者
中刷新插件并重启。
text
最基本的是 text,仅在Alt + R
中可用,根据输入模糊匹配去调出插件:
1 |
|
text 没有 payload……这个类型应当改名叫 keyword。
over
over 支持Alt+R
和超级面板,over 在任何输入和选择上都会显示在列表上,根据和你给定的 label 的距离决定排序(?):
1 |
|
over 的 payload 为输入框或选择的内容。
img
img 可以通过 Ctrl+V 将剪切板内图片贴到输入框,在文件管理器中框选文件似乎也能够识别,但疑似是有 bug:
1 |
|
regex
regex 类似 over,但支持给定一个 js 语法的正则表达式,只有和当前输入框或选择匹配时才显示出来:
1 |
|
regex 的 payload 为输入框或选择的内容。
遗憾的是,现在 regex 的代码有 bug,无法使用,见 https://github.com/rubickCenter/rubick/pull/184,已经是整整一年前的 issue 了,没人修吗?
刚修,我提了 PR 后一瞬间就修了,虽然我的 PR 后来发现和它重复给 close 了,顺便得了个 5 分钟内撤回 PR 的成就,乐。但至少4.2.4
版本中该修复还未上线。
SubInput
SubInput 为主窗口中的输入框,插件可以监听该输入框的改变,如 everything 等插件都利用了 SubInput 去作输入。进入 over 和 regex 等 feature 时 subInput 中的东西会在插件 ready 时传给插件。
关于 subInput 的使用参照src/useSubInput.ts
。
DB
摸了,关于 DB 的使用,检查/preload/rubick.ts
里的类型定义即能知晓,关于对单个键的使用,见src/useDB.ts
,这里整了个花活儿,使它能做跨渲染进程的同步,即插件多开时也能做同步;但需要系统插件协作。
…
摸了
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 协议 ,转载请注明出处!