本頁目錄
外掛開發與實現
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 會自動驗證並載入外掛套件。確認設定無誤後,點擊 確定 儲存生效。