本页目录
插件开发与实现
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 中描述状态。 - 仅在发生致命错误或无效调用时以非零代码退出(非零退出会导致宿主直接清空该请求目录)。
- 正常领域结果(例如未签名文件、非 git 仓库、空元数据等)必须以退出码
命令行占位符
| 占位符 | 说明 | 示例 |
|---|---|---|
${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 压缩包以供安装使用。该规范适用于所有插件能力。
打包规范
- 随包文档:每个独立的控制栏或属性插件包应包含
PACKAGE_README.md(包含说明及## Options & Arguments参数表),打包时作为README.md放置在包根目录下。 - 扁平根目录布局:对于控制栏和属性插件(Canonical v1),
plugin.json、可执行文件/脚本、README.md及运行时依赖项必须直接位于压缩包根目录下。请勿包裹在多余的父级目录中,且严禁混用扁平与嵌套结构——宿主会拒绝根结构模糊的压缩包。从在线目录安装的传统转换插件使用相反的布局:由一个与压缩包同名的顶层目录
<archive-name>/包裹包内文件。该情况请参考转换插件开发指南,两种布局不可互换。 - 最高压缩级别:推荐使用 7-Zip 并开启最大 Deflate 压缩率打包:
powershell 7z a -tzip -mx=9 my-plugin-1.0.0.zip .\*
本地应用内测试
- 打开 Seer 设置,切换至目标功能页面:
- 预览插件:
设置 > 插件-> 本地 标签页 - 控制栏插件:
设置 > 控制栏 - 属性插件:
设置 > 属性
- 预览插件:
- 点击列表下方的 + 并选择
.zip压缩包(或本地开发目录中的plugin.json)。 - Seer 会自动校验并加载插件包。确认配置无误后,点击 确定 保存生效。