Skip to content

插件示例

SwiftList 自帶兩個插件,都是很有參考價值的真實案例——都在 SwiftList 倉庫的 Plugins/ 目錄下。

CoreExtensions —— 動作與 Shell 右鍵選單

CoreExtensionsPlugin 同時實現了三個接口:IPluginIActionProviderIConfigurable

  • IActionProvider.GetActions() 返回十個內置的 ISearchResultAction——打開、在檔案總管中定位、複製路徑、複製/剪下檔案本身、在其所在位置打開命令提示字元、touch/mkdir,以及打開和命令提示字元的提權(以系統管理員身份運行)變體。
  • IActionProvider.GetDynamicActionProviders() 返回一個 IDynamicActionProvider—— ShellMenuActionProvider——正是它讓真正的 Windows 右鍵選單(包括"發送到"這類級聯子選單)出現在 SwiftList 自己的動作選單裏。如果你想在 SwiftList 裏呈現任何外部、動態構建的選單,而不是一份固定的動作列表,這是值得照抄的模式。
  • IConfigurable.GetConfigSchema() 展示了帶嵌套欄位分組和 StringList 欄位類型的配置模式 ——如果你的插件在設定 → 插件的配置對話方塊裏需要的不只是一份扁平的布爾值列表,值得讀一下這部分。
  • FavoritesTabProviderHistoryTabProvider 各自實現了 IStartupPanelTabProvider,把已有的列表以標籤的形式呈現在初始面板裏——是這個接口的一個最簡參考實現,因為兩者都只是把一份已經查詢好的列表包一層,自己沒有額外的狀態。

PinyinAlias —— 中文檔案名拼音別名

PinyinAliasProvider 同時實現了 IAliasProviderITranslationProvider——一個插件可以自由組合多個相關的 SDK 角色,這是個很好的參考模板:

  • IAliasProvider.InputRanges/OutputRanges 直接複用 PinyinEngine 自己表裏的邊界來聲明這兩個字母表(InputRanges:CJK 區塊;OutputRanges:a-z),不重複寫魔數——宿主用它們支援 "大cj"匹配"大長今"這類混合了字面漢字和拼音的查詢。
  • IAliasProvider.CanHandle(text) 會先掃描是否存在任意中文字元,再決定要不要做實際工作,所以非中文檔案名會完全跳過別名生成。
  • IAliasProvider.GetAliases(text) 先構建一張按字元劃分的音節表(每個漢字映射到它可能的拼音讀音),然後產出一個全拼別名和一個首字母別名。對於含多音字(有一種以上有效讀音)的檔案名,會為每種常見讀音組合都生成別名——上限 32 種組合,防止極端輸入引發組合爆炸——用 | 連接各個備選項,這樣搜尋引擎會把每一個都當作候選,而不是要求它們同時全部匹配。
  • ITranslationProvider 實現在同一個類上,純粹是為了給這個插件自己的介面文本(比如它的顯示名稱)提供翻譯,通過 TranslationService.LoadEmbeddedTranslations 實現——這兩個接口用途上並無關聯,只是碰巧在這個體量很小的單檔案插件裏放在了同一個類型上。
  • 用一個 lock 保護的 Dictionary<string, Dictionary<string, string>> 快取避免了每次調用 GetTranslations 都重新解析內嵌的翻譯 JSON——這是任何在 GetTranslations 裏做了非平凡工作的插件都該採用的標準模式。

把這兩個插件對照着看,是理解插件 SDK 參考裏各個部分如何在實踐中配合起來最快的方式。