插件 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订阅 documentSaveddocumentOpenededitorChanged 等事件
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 提交到市场。