本頁目錄

外掛開發與實現

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 會自動驗證並載入外掛套件。確認設定無誤後,點擊 確定 儲存生效。