插件 API
为 Novelist 编写插件时可以使用的 API。
Novelist 插件使用 JavaScript / TypeScript 编写,通过 @novelist/plugin-api 这个轻量运行时暴露给插件的接口。
Hello, plugin
import type { Plugin } from '@novelist/plugin-api';
const plugin: Plugin = {
async onLoad(ctx) {
ctx.commands.register({
id: 'my-plugin.say-hello',
title: 'Say hello',
run: async () => {
ctx.notifications.info('Hello from my plugin!');
},
});
},
};
export default plugin;
ctx 能做什么
| 命名空间 | 用途 |
|---|---|
ctx.commands | 注册 / 取消注册命令,执行其他命令 |
ctx.editor | 读写当前文档、移动光标、做批量编辑 |
ctx.workspace | 查询所有打开的文档、监听打开与关闭 |
ctx.ui | 在侧边栏、状态栏或命令面板里添加视图 |
ctx.events | 订阅 documentSaved、documentOpened、editorChanged 等事件 |
ctx.settings | 读写插件自己的设置 |
ctx.notifications | 显示提示 / 进度 / 错误 |
在应用仓库的 creating-plugins.md 中可以看到完整的接口定义。
生命周期
onLoad(ctx) // 插件启用时调用
onUnload(ctx) // 插件禁用 / 卸载时调用
插件被禁用时要注销它注册的所有命令与视图——ctx.disposables 提供 Disposable 聚合器,用完即弃。
权限模型
如果你的插件需要读取文档内容,在 manifest.toml 中加上 "read" 权限;写入则加 "write"。ctx.editor 的方法会根据插件声明的权限运行;没有对应权限时方法会抛出 PermissionError。
打包
pnpm install
pnpm build # 产出 dist/
pnpm pack # 生成 <id>-<version>.zip
把 ZIP 作为 GitHub Release 资产上传,然后按 提交插件 把 manifest 提交到市场。