本页目录

插件开发与实现

Seer 提供了高度模块化的插件体系,支持开发者针对不同场景扩展应用能力。请在下方选择您要开发的插件类型:

预览插件 (Viewers)

预览插件用于扩展按下空格键时的文件展示能力。支持 转换类型插件 (Convert) 和 DLL 类型插件 (SDK v3) 两种架构。

使用 AI 助手构建预览插件

替换下方的需求占位符,然后向您的编程助手发送完整指令:

请阅读并遵循位于 https://raw.githubusercontent.com/ccseer/Seer-Plugins/refs/heads/master/plugin_development_guide.md 的 Seer 插件开发指南。将其视为架构、plugin.json、实现、验证和打包的唯一事实来源。如果该指南不可用,请在继续之前停止并报告。

在开始任何工作之前,请检查下方的 Requirement(需求)。如果其缺失、为未更改的占位符文本或过于模糊而无法实现,请提出一个澄清问题并等待。请勿推测缺失的需求。

明确后,选择 Convert 或 DLL 并简要说明理由,然后在当前工作区中实现一个完整的、可安装的插件。请勿修改 Seer 本身,也不要仅停留在计划或代码片段上。

遵循指南中所有适用的验证步骤并报告实际结果。尽可能运行应用内 Seer 预览测试;否则请明确说明未进行运行时验证。

Requirement: [将此占位符替换为预览插件需求,例如:支持 preview markdown 中的 mermaid 图表]

转换类型插件 (Convert)

Seer 将转换类型插件视为外部命令行执行程序。当用户在支持的文件上按空格键时,Seer 执行配置的程序,并通过占位符传递文件路径。程序将目标文件转为 Seer 原生支持的格式(HTML、JSON、TXT、图片等),进程退出后由 Seer 加载渲染。

占位符变量

占位符 说明 示例
${output_file} 基础输出文件路径;在参数中追加目标扩展名。 ${output_file}.html
${no_cache} 禁用转换缓存,并将输出保存在自动删除目录中,该目录在预览窗口关闭时清空。 ${no_cache}

转换插件同样支持全局通用占位符(${input_file}、${use_backslash}、${seer_dir}、${seer_exe}、${seerviewer_exe}、${7z});因其在 formats 中声明匹配扩展名而非 extensions,故不支持 ${type_*} 匹配标记。二者详见下方的公共 占位符与匹配标记 章节。

支持的可执行文件与脚本类型

  • 脚本:PowerShell 脚本(.ps1,Seer 原生支持自动调用 PowerShell)。对于 Python (.py)、Node.js (.js) 或批处理 (.bat),建议编译为独立 .exe(如使用 PyInstaller),或将解释器内置在包中。
  • 自定义程序:C/C++、Rust、Go 或 C# 编译的独立 CLI 可执行文件。

plugin.json 示例 (Convert)

{
  "name": "ipynb",
  "version": "1.2.0",
  "type": "convert",
  "roles": [
    "viewer"
  ],
  "entry": "ipynb.ps1",
  "args": [
    "-i",
    "${input_file}",
    "-o",
    "${output_file}.html"
  ],
  "formats": [
    "ipynb"
  ],
  "appMinVersion": "4.1.3",
  "author": "ccseer"
}

DLL 类型插件 (SDK v3)

对于追求极致渲染性能、深度交互或流式视图的格式,Seer 支持通过 QPluginLoader 直接加载至视口中的 C++/Qt 动态链接库。

  • 技术规范:C++17,Qt 6.8,MSVC 2022 (x64),CMake 3.22+。
  • 核心接口:继承 ViewerBase(窗口组件实现)并实现 ViewerPluginInterface(IID 为 "seer.plugin.interface.preview/3")。
  • 最低支持版本:SDK v3 插件必须声明 "appMinVersion": "4.2.9"。

官方参考项目

项目 目的
F3DViewer 3D 模型渲染与全景预览
OfficeViewer Office 文档与 CAD 图纸
FontViewer 字体字形检查与渲染
JsonTreeViewer 高性能交互式 JSON 树状视图
Collections 所有官方与社区预览插件

控制栏插件 (Control Plugins)

控制栏插件在预览窗口底部控制栏左侧添加自定义操作按钮,针对当前激活的文件或文件夹启用快捷操作及外部工具联动。

使用 AI 助手构建控制栏插件

替换下方的需求占位符,然后向您的编程助手发送完整指令:

请阅读并遵循位于 https://raw.githubusercontent.com/ccseer/Seer-Controls/refs/heads/main/plugin_development_guide.md 的 Seer 控制栏插件开发指南。将其视为架构、plugin.json、实现、验证和打包的唯一事实来源。如果该指南不可用,请在继续之前停止并报告。

在开始任何工作之前,请检查下方的 Requirement(需求)。如果其缺失、为未更改的占位符文本或过于模糊而无法实现,请提出一个澄清问题并等待。请勿推测缺失的需求。

明确后,在当前工作区中实现一个完整的、符合 Canonical v1 进程契约的可安装控制栏插件。请勿修改 Seer 本身,也不要仅停留在计划或代码片段上。

遵循指南中所有适用的验证步骤并报告实际结果。

Requirement: [将此占位符替换为控制栏插件需求,例如:在当前文件夹打开 VS Code 或复制绝对路径到剪贴板]

架构与契约

  • 进程模型:实现 Canonical v1 进程契约(backend: "process", capabilities: ["control"])。Seer 通过命令行执行对应辅助程序。
  • 返回状态与错误报告:
    • 成功:进程以退出码 0 退出(或匹配 success_exit_codes)。若配置了 "close_after_success": true,Seer 将在执行成功后自动关闭预览窗口。
    • 失败:进程以非零代码退出。写入标准错误(stderr)的所有内容均由 Seer 捕获,并作为应用内 Toast 失败通知 展示给用户。
  • 界面与交互:控制栏插件无需绘制常驻主窗口。典型操作包括执行后台任务、复制文本至剪贴板,或调起 Windows 系统原生对话框(如“打开方式”、“属性”、“共享”等)。

命令行占位符

控制栏插件仅接收目标路径:${input_file} 及下方公共 占位符与匹配标记 章节中列出的全局占位符(${use_backslash}、${seer_dir}、${seer_exe}、${seerviewer_exe}、${7z})。

控制栏插件清单中严禁使用 ${output_dir}、${output_file} 和 ${no_cache}。若插件需要暂存位置,必须自行解析:优先选择自身可执行文件所在目录,其次使用系统临时目录。

plugin.json 示例 (Control)

示例 1:文件夹动作 (Terminal Here)

官方 Terminal Here 插件配置:

{
  "schema_version": 1,
  "id": "io.1218.seer.terminal-here",
  "name": "Terminal Here",
  "description": "Opens a terminal window in the current folder.",
  "version": "1.0.0",
  "appMinVersion": "4.5.10",
  "backend": "process",
  "capabilities": [
    "control"
  ],
  "extensions": [
    "${type_folder}"
  ],
  "command": "terminal_here.exe",
  "arguments": [
    "--input",
    "${input_file}"
  ],
  "close_after_success": false,
  "timeout_ms": 150000,
  "success_exit_codes": [
    0
  ]
}

示例 2:文件动作 (Explorer Open With)

官方 Explorer Open With 插件配置:

{
  "schema_version": 1,
  "id": "io.1218.seer.explorer-open-with",
  "name": "Open With",
  "description": "Opens the Windows Open With dialog for the current file.",
  "version": "1.1.0",
  "appMinVersion": "4.5.10",
  "backend": "process",
  "capabilities": [
    "control"
  ],
  "extensions": [
    "${type_file}"
  ],
  "command": "shellopenwith.exe",
  "arguments": [
    "--input",
    "${input_file}",
    "${use_backslash}"
  ],
  "timeout_ms": 30000,
  "success_exit_codes": [
    0
  ]
}

若希望在执行成功后自动关闭预览窗口,请在清单中设置 "close_after_success": true。

官方控制栏插件源码请参阅:ccseer/Seer-Controls。

属性插件 (Property Plugins)

属性插件用于扩展 Seer 的元数据检查引擎。当用户对预览的文件或文件夹按下 Ctrl + I(或打开属性窗口)时,匹配的属性插件将提取并展示结构化元数据和可视化图表。

使用 AI 助手构建属性插件

替换下方的需求占位符,然后向您的编程助手发送完整指令:

请阅读并遵循位于 https://raw.githubusercontent.com/ccseer/Seer-Properties/refs/heads/main/plugin_development_guide.md 的 Seer 属性插件开发指南。将其视为架构、plugin.json、实现、验证和打包的唯一事实来源。如果该指南不可用,请在继续之前停止并报告。

在开始任何工作之前,请检查下方的 Requirement(需求)。如果其缺失、为未更改的占位符文本或过于模糊而无法实现,请提出一个澄清问题并等待。请勿推测缺失的需求。

明确后,在当前工作区中实现一个完整的、符合 Canonical v1 进程契约与 Schema 1 JSON 规范的可安装属性插件。请勿修改 Seer 本身,也不要仅停留在计划或代码片段上。

遵循指南中所有适用的验证步骤并报告实际结果。

Requirement: [将此占位符替换为属性插件需求,例如:提取并展示 MP4 文件的详细音视频编解码参数与码率]

架构与契约

  • 进程模型:实现 Canonical v1 进程契约(backend: "process", capabilities: ["property"], result_schema: 1)。
  • 命令行调用:宿主传递参数如下: --input "${input_file}" --output "${output_file}" --output-dir "${output_dir}"
  • 输出发布:
    • 宿主将 ${output_file} 展开为无后缀名的基础路径(例如 <requestDir>/<md5>)。
    • 插件必须将 JSON 结果写入 <output-base>.json(即 ${output_file}.json)。
    • 可视化附件(图表、直方图、矢量图等)必须保存在 ${output_dir} 中。
    • 约束:属性插件严禁使用 ${no_cache}。
  • 退出码规范:
    • 正常领域结果(例如未签名文件、非 git 仓库、空元数据等)必须以退出码 0 退出并在 JSON 中描述状态。
    • 仅在发生致命错误或无效调用时以非零代码退出(非零退出会导致宿主直接清空该请求目录)。

命令行占位符

占位符 说明 示例
${output_file} 宿主分配的基础输出路径(无扩展名);结果必须写入 ${output_file}.json。 C:\Users\...\request_dir\md5_hash
${output_dir} 宿主分配的附件请求目录(图表、图片)。 C:\Users\...\request_dir

此外支持下方公共 占位符与匹配标记 章节中列出的全局占位符以及 ${type_*} 匹配标记。属性插件严禁使用 ${no_cache}。

Result JSON (Schema 1) 规范

结果文件 ${output_file}.json 必须是包含 result_schema: 1 和 data 对象的合法 UTF-8 JSON:

1. 单层键值(Flat Rows)

仅当整个结果是单行时使用(如 SHA-256):

{
  "result_schema": 1,
  "data": {
    "SHA-256": "2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824"
  }
}

2. 带单键对象有序数组的分组(默认)

产生多行结果的内容必须发布为恰好一个以插件命名的分组——顶层散行会与其他所有插件的行冲突,而检查器将它们显示在同一个列表中。数组的顺序就是渲染顺序,因此这是唯一能让插件决定行显示先后次序的形式:

{
  "result_schema": 1,
  "data": {
    "Git": {
      "value": [
        { "Repository": "ccseer/Seer-Properties" },
        { "Branch": "main" },
        { "Status": "Clean" }
      ]
    }
  }
}

3. 带值对象的分组

value 也可以是普通对象,但其行会按解析后对象的键序渲染,插件无法控制。仅在行的先后次序无关紧要时使用:

{
  "result_schema": 1,
  "data": {
    "Git": {
      "value": {
        "Branch": "main",
        "Status": "Working tree clean"
      }
    }
  }
}

4. 可视化图表与波形(图片附件)

将生成的 PNG 图表保存在 ${output_dir} 中,并通过 {"type": "image", "value": "relative_filename.png"} 声明:

{
  "result_schema": 1,
  "data": {
    "Image Scopes": {
      "value": [
        { "RGB Histogram": { "type": "image", "value": "histogram.png" } },
        { "Luma Waveform": { "type": "image", "value": "waveform.png" } }
      ]
    }
  }
}

plugin.json 示例 (Property)

{
  "schema_version": 1,
  "id": "io.1218.seer.git-info",
  "name": "Git Info",
  "description": "Reports repository information for the current folder using Git.",
  "version": "1.0.0",
  "appMinVersion": "4.5.10",
  "backend": "process",
  "capabilities": [
    "property"
  ],
  "extensions": [
    "${type_folder}"
  ],
  "invocations": {
    "property": {
      "command": "git_info.exe",
      "arguments": [
        "--input",
        "${input_file}",
        "--output",
        "${output_file}",
        "--output-dir",
        "${output_dir}"
      ],
      "result_schema": 1,
      "timeout_ms": 30000,
      "success_exit_codes": [
        0
      ]
    }
  }
}

官方属性插件源码请参阅:ccseer/Seer-Properties。


占位符与匹配标记

Seer 在 arguments 参数中展开以下标记。插件清单加载时,宿主会严格校验所声明能力对应的占位符支持情况——使用不受支持的占位符属于清单加载致命错误,而非运行时警告。

通用占位符

占位符 说明 示例
${input_file} 预览文件或文件夹的绝对路径。 C:\Docs\sample.pdf
${use_backslash} 可选标志,使用 Windows 原生反斜杠 (\) 格式化路径分隔符。 ${use_backslash}
${seer_dir} 包含 Seer.exe 的目录路径。 C:\Program Files\Seer
${seer_exe} Seer.exe 的绝对路径。 C:\Program Files\Seer\Seer.exe
${seerviewer_exe} SeerViewer.exe 的绝对路径。 C:\Program Files\Seer\SeerViewer.exe
${7z} Seer 随附的 7z.exe 绝对路径。 C:\Program Files\Seer\plugins\7z.exe
${theme} Seer 当前生效主题,展开为 dark 或 light。属于数据占位符,不能单独作为 command。 dark
${lang} Seer 当前生效语言,展开为 BCP-47 格式(如 en、zh-CN)。属于数据占位符,不能单独作为 command。 en
${screenshot} 当前视图截图的临时 PNG 绝对路径。 C:\Users\Username\AppData\Local\Temp\Seer\screenshot\view_1.png

各能力专属占位符

占位符 预览 (Preview) 控制栏 (Control) 属性 (Property)
${output_file} 基础输出路径;需追加目标扩展名,如 ${output_file}.html 不支持 无扩展名的基础路径;结果必须写入 ${output_file}.json
${output_dir} 不支持 不支持 附件请求目录(图表、图片)
${no_cache} 禁用转换缓存并将输出存入自动删除目录 不支持 不支持

控制栏插件仅接收目标路径。如果需要临时空间,必须自行解析:优先选择插件自身可执行文件目录,其次使用系统临时目录。

extensions 格式匹配标记

除常规扩展名(例如 ["png", "zip"])外,extensions 还支持匹配广泛类别的特殊标记。这些标记适用于声明 extensions 的插件(控制栏与属性插件);转换插件使用 formats 声明,不支持此类标记。

标记 说明
${type_folder} 匹配文件夹与目录。
${type_file} 匹配所有常规文件(包含无扩展名文件)。
${type_all} 匹配所有内容(同时匹配文件和文件夹)。
${type_image} 匹配 Seer 内置图片查看器支持的图片格式。
${type_media} 匹配音频和视频格式。
${type_web} 匹配 HTML 与 Markdown 等网页文件。
${type_text} 匹配文本、代码及配置文件。
${type_pdf} 匹配 PDF 文档。
${type_none} 匹配不属于上述分类的文件(如压缩包、可执行程序等)。

打包发布与本地验证

插件开发完成后,必须打包为标准 ZIP 压缩包以供安装使用。该规范适用于所有插件能力。

打包规范

  1. 随包文档:每个独立的控制栏或属性插件包应包含 PACKAGE_README.md(包含说明及 ## Options & Arguments 参数表),打包时作为 README.md 放置在包根目录下。
  2. 扁平根目录布局:对于控制栏和属性插件(Canonical v1),plugin.json、可执行文件/脚本、README.md 及运行时依赖项必须直接位于压缩包根目录下。请勿包裹在多余的父级目录中,且严禁混用扁平与嵌套结构——宿主会拒绝根结构模糊的压缩包。

    从在线目录安装的传统转换插件使用相反的布局:由一个与压缩包同名的顶层目录 <archive-name>/ 包裹包内文件。该情况请参考转换插件开发指南,两种布局不可互换。

  3. 最高压缩级别:推荐使用 7-Zip 并开启最大 Deflate 压缩率打包: powershell 7z a -tzip -mx=9 my-plugin-1.0.0.zip .\*

本地应用内测试

  1. 打开 Seer 设置,切换至目标功能页面:
    • 预览插件:设置 > 插件 -> 本地 标签页
    • 控制栏插件:设置 > 控制栏
    • 属性插件:设置 > 属性
  2. 点击列表下方的 + 并选择 .zip 压缩包(或本地开发目录中的 plugin.json)。
  3. Seer 会自动校验并加载插件包。确认配置无误后,点击 确定 保存生效。