«

Obsidian插件开发指南

daidaini 发布于 阅读:93 程序员学习


Obsidian 插件开发环境搭建

提示: 插件开发时可使用 console.log() 或 Obsidian 的 new Notice() 在开发者控制台输出调试信息,并可通过 开发者工具(Ctrl+Shift+I)查看报错日志。

插件文件结构说明

.obsidian/plugins/你的插件ID/ 文件夹中,至少需要以下文件:

示例 manifest.json 结构:

{
  "id": "translate-plugin",
  "name": "Text Translator",
  "version": "1.0.0",
  "minAppVersion": "0.9.12",
  "description": "Translate selected English text to Chinese.",
  "author": "Your Name",
  "authorUrl": "https://your.website",
  "fundingUrl": "",
  "js": "main.js"
}

将以上文件放在同一个名为 translate-plugin 的文件夹下,并复制到 Vault 的 .obsidian/plugins/ 目录即可。

编写插件主文件 main.js

下面给出一个示例 main.js,展示如何获取选中文本并调用翻译 API,将结果替换回编辑器。代码包含完整注释,便于理解和调试。

module.exports = class TranslatePlugin extends Plugin {
  async onload() {
    // 在加载时注册一个命令到命令面板,使用快捷键或命令面板触发翻译
    this.addCommand({
      id: 'translate-selection',
      name: '翻译选中文本',
      // 使用 editorCallback 以便获取当前编辑器实例
      editorCallback: async (editor, view) => {
        // 获取当前选中文本
        const selected = editor.getSelection();
        if (!selected) {
          // 如果没有选中任何文本,给出提示
          new Notice("请先选中文本再翻译");
          return;
        }
        // 调用翻译 API(示例使用 LibreTranslate 的公开服务)
        try {
          const res = await fetch("https://translate.argosopentech.com/translate", {
            method: "POST",
            body: JSON.stringify({
              q: selected,       // 待翻译文本
              source: "en",      // 源语言:英文
              target: "zh",      // 目标语言:简体中文
              format: "text"
            }),
            headers: { "Content-Type": "application/json" }
          });
          const data = await res.json();
          const translated = data.translatedText;
          // 将翻译结果替换掉原选中的文本:contentReference[oaicite:13]{index=13}
          editor.replaceSelection(translated);
        }
        catch (error) {
          // 出现错误时提示用户,并打印到控制台
          new Notice("翻译失败:" + error.message);
          console.error(error);
        }
      }
    });

    // 注册右键菜单,在编辑器中选中文本后右键可见此选项:contentReference[oaicite:14]{index=14}
    this.registerEvent(this.app.workspace.on("editor-menu", (menu, editor, view) => {
      menu.addItem(item => {
        item
          .setTitle("翻译为中文")
          .onClick(async () => {
            const selected = editor.getSelection();
            if (!selected) {
              new Notice("请先选中文本再翻译");
              return;
            }
            try {
              const res = await fetch("https://translate.argosopentech.com/translate", {
                method: "POST",
                body: JSON.stringify({
                  q: selected,
                  source: "en",
                  target: "zh",
                  format: "text"
                }),
                headers: { "Content-Type": "application/json" }
              });
              const data = await res.json();
              const translated = data.translatedText;
              editor.replaceSelection(translated);
            }
            catch (error) {
              new Notice("翻译失败:" + error.message);
              console.error(error);
            }
          });
      });
    }));
  }

  onunload() {
    // 可在此处执行插件卸载时的清理操作(如移除事件等)
  }
}

代码说明: 上例使用 editor.getSelection() 获取选中文本,然后通过 fetch 请求 LibreTranslate(开源翻译 API)实现翻译。注意将 editorCallback 和菜单的回调函数都声明为 async,以便使用 await 处理异步请求。在得到翻译结果后,用 editor.replaceSelection(translated) 方法替换选中的文本。如果希望在原文后插入翻译结果而不删除原文,可改用 editor.replaceRange() 或先读取原文再拼接后插入;此处示例以直接替换为主。

插件打包与加载

完成开发后,将插件文件夹部署到你的 Vault 中:

  1. 打包:由于使用纯 JS,无需特殊构建步骤。确保 manifest.jsonmain.js(以及可选的 styles.css 等)位于同一文件夹下。

  2. 复制到 Vault:将整个插件文件夹(文件名应与 manifest.json 中的 id 相同)复制到 Vault 根目录下的 .obsidian/plugins/ 文件夹中。

  3. 加载插件:重启 Obsidian 或在设置中刷新插件页面,然后在 设置 → 社区插件 中启用你的插件。如果是克隆了官方样例仓库,可先运行 npm run dev 生成最终的 main.js(但对于纯 JS 模板,这一步可省略)。

提示: 如果修改了插件代码,可使用 “Hot Reload” 插件自动重载,或手动在 Obsidian 中停用再启用插件来加载最新代码。

code js note

收到1条评论
avatar
somebody 4 天前
do you really know how to develop?
回复