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
2
3
{
"cmds": ["test"]
}

text 没有 payload……这个类型应当改名叫 keyword。

over

over 支持Alt+R和超级面板,over 在任何输入和选择上都会显示在列表上,根据和你给定的 label 的距离决定排序(?):

1
2
3
4
5
6
7
8
9
{
"cmds": [
{
"type": "over",
"label": "test_over" // 用户的输入越接近 "test_over" 的话该选项就会越靠前……似乎是这样,至少在输入框中似乎是这样
}
]
}

over 的 payload 为输入框或选择的内容。

img

img 可以通过 Ctrl+V 将剪切板内图片贴到输入框,在文件管理器中框选文件似乎也能够识别,但疑似是有 bug:

1
2
3
4
5
6
7
8
9
10

{
"cmds": [
{
"type": "img",
"label": "test_img"
}
]
}

regex

regex 类似 over,但支持给定一个 js 语法的正则表达式,只有和当前输入框或选择匹配时才显示出来:

1
2
3
4
5
6
7
8
9
{
"cmds": [
{
"type": "regex",
"label": "test_regex",
"match": "/一个 js 风格的正则/im"
}
]
}

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 协议 ,转载请注明出处!