EverythingToolbar插件系统与扩展开发

EverythingToolbar插件系统与扩展开发

【免费下载链接】EverythingToolbar 【免费下载链接】EverythingToolbar 项目地址: https://gitcode.com/gh_mirrors/ev/EverythingToolbar

EverythingToolbar作为Windows任务栏的Everything搜索集成工具,采用了模块化、可扩展的插件架构设计。本文详细解析了其插件系统的核心架构、接口规范、自定义搜索过滤器开发方法、文件操作规则扩展实现以及第三方工具集成的最佳实践,为开发者提供全面的插件开发指南。

插件架构设计与接口规范

EverythingToolbar作为Windows任务栏的Everything搜索集成工具,其插件系统采用了模块化、可扩展的架构设计。通过深入分析项目代码结构,我们可以清晰地看到其插件架构的核心设计理念和接口规范。

架构设计概览

EverythingToolbar的插件架构基于分层设计原则,主要分为以下几个核心层次:

mermaid

核心接口设计规范

1. 搜索提供者接口 (ISearchProvider)

搜索提供者是插件系统的核心接口,负责处理搜索请求和结果返回:

public interface ISearchProvider
{
    // 初始化搜索提供者
    bool Initialize(string instanceName);
    
    // 执行搜索查询
    Task<SearchResultsCollection> QueryAsync(
        string searchTerm, 
        Filter currentFilter, 
        SearchOptions options);
    
    // 取消当前搜索
    void CancelSearch();
    
    // 获取搜索统计信息
    SearchStatistics GetStatistics();
    
    // 事件:搜索开始
    event EventHandler<SearchStartedEventArgs> SearchStarted;
    
    // 事件:搜索结果更新
    event EventHandler<SearchResultsUpdatedEventArgs> ResultsUpdated;
    
    // 事件:搜索完成
    event EventHandler<SearchCompletedEventArgs> SearchCompleted;
}
2. 过滤器提供者接口 (IFilterProvider)

过滤器接口定义了搜索过滤器的管理和应用规范:

public interface IFilterProvider
{
    // 获取所有可用过滤器
    ObservableCollection<Filter> GetAllFilters();
    
    // 获取默认过滤器
    Filter GetDefaultFilter();
    
    // 获取用户自定义过滤器
    ObservableCollection<Filter> GetUserFilters();
    
    // 添加新过滤器
    void AddFilter(Filter filter);
    
    // 移除过滤器
    bool RemoveFilter(string filterName);
    
    // 更新过滤器
    void UpdateFilter(Filter filter);
    
    // 根据名称查找过滤器
    Filter FindFilter(string filterName);
}
3. 结果处理器接口 (IResultHandler)

结果处理器负责处理搜索结果的各种操作:

public interface IResultHandler
{
    // 打开文件/文件夹
    void OpenItem(SearchResult result, OpenOptions options);
    
    // 打开所在文件夹
    void OpenContainingFolder(SearchResult result);
    
    // 复制路径到剪贴板
    void CopyPathToClipboard(SearchResult result);
    
    // 显示文件属性
    void ShowFileProperties(SearchResult result);
    
    // 运行文件(管理员权限)
    void RunAsAdministrator(SearchResult result);
    
    // 预览文件内容
    Task PreviewFileAsync(SearchResult result);
}

数据结构规范

搜索选项结构
public struct SearchOptions
{
    public bool MatchCase { get; set; }
    public bool MatchPath { get; set; }
    public bool MatchWholeWord { get; set; }
    public bool UseRegex { get; set; }
    public SortOrder SortBy { get; set; }
    public bool ShowThumbnails { get; set; }
    public int MaxResults { get; set; }
    public int BatchSize { get; set; }
}

public enum SortOrder
{
    NameAscending,
    NameDescending,
    DateModifiedAscending,
    DateModifiedDescending,
    SizeAscending,
    SizeDescending
}
搜索结果结构
public class SearchResult
{
    public string HighlightedPath { get; set; }
    public string HighlightedFileName { get; set; }
    public string FullPathAndFileName { get; set; }
    public bool IsFile { get; set; }
    public DateTime DateModified { get; set; }
    public long FileSize { get; set; }
    public string FileType { get; set; }
    public BitmapSource Thumbnail { get; set; }
}

public class SearchResultsCollection : ObservableCollection<SearchResult>
{
    public void AddSilent(SearchResult item) { /* 实现 */ }
    public void ClearSilent() { /* 实现 */ }
    public void NotifyCollectionChanged() { /* 实现 */ }
}

插件注册与发现机制

EverythingToolbar采用基于约定的插件发现机制:

mermaid

插件发现配置
public class PluginConfiguration
{
    // 插件目录路径
    public string PluginDirectory { get; set; } = "Plugins";
    
    // 自动发现插件
    public bool AutoDiscoverPlugins { get; set; } = true;
    
    // 插件加载超时时间(毫秒)
    public int PluginLoadTimeout { get; set; } = 5000;
    
    // 启用的插件列表
    public List<string> EnabledPlugins { get; set; } = new List<string>();
    
    // 禁用的插件列表
    public List<string> DisabledPlugins { get; set; } = new List<string>();
    
    // 插件依赖关系
    public Dictionary<string, List<string>> PluginDependencies { get; set; } 
        = new Dictionary<string, List<string>>();
}

错误处理与日志规范

插件系统采用统一的错误处理和日志记录机制:

public static class PluginErrorHandler
{
    // 错误代码定义
    public enum ErrorCode
    {
        Success = 0,
        PluginLoadFailed = 1001,
        InterfaceNotImplemented = 1002,
        DependencyMissing = 1003,
        ConfigurationError = 1004,
        ExecutionTimeout = 1005
    }
    
    // 统一错误处理方法
    public static void HandleError(ErrorCode errorCode, string message, Exception ex = null)
    {
        var logger = ToolbarLogger.GetLogger("PluginSystem");
        
        switch (errorCode)
        {
            case ErrorCode.PluginLoadFailed:
                logger.Error(ex, "插件加载失败: {Message}", message);
                break;
            case ErrorCode.InterfaceNotImplemented:
                logger.Warn("插件接口未实现: {Message}", message);
                break;
            default:
                logger.Error("插件系统错误[{Code}]: {Message}", errorCode, message);
                break;
        }
        
        // 触发错误事件
        PluginErrorOccurred?.Invoke(null, 
            new PluginErrorEventArgs(errorCode, message, ex));
    }
    
    public static event EventHandler<PluginErrorEventArgs> PluginErrorOccurred;
}

public class PluginErrorEventArgs : EventArgs
{
    public PluginErrorHandler.ErrorCode ErrorCode { get; }
    public string Message { get; }
    public Exception Exception { get; }
    
    public PluginErrorEventArgs(PluginErrorHandler.ErrorCode errorCode, 
        string message, Exception ex)
    {
        ErrorCode = errorCode;
        Message = message;
        Exception = ex;
    }
}

性能优化与最佳实践

为了确保插件系统的性能和稳定性,遵循以下最佳实践:

优化领域实施策略预期效果
内存管理使用对象池和缓存机制减少GC压力,提高响应速度
并发处理异步编程和线程池优化提高多任务处理能力
资源释放实现IDisposable接口避免内存泄漏
错误隔离插件沙箱机制单个插件崩溃不影响整体系统
配置管理懒加载和按需初始化减少启动时间和内存占用
// 插件生命周期管理示例
public abstract class PluginBase : IDisposable
{
    private bool _disposed = false;
    
    protected virtual void Initialize() { /* 插件初始化 */ }
    protected virtual void OnEnabled() { /* 插件启用 */ }
    protected virtual void OnDisabled() { /* 插件禁用 */ }
    
    public void Dispose()
    {
        Dispose(true);
        GC.SuppressFinalize(this);
    }
    
    protected virtual void Dispose(bool disposing)
    {
        if (!_disposed)
        {
            if (disposing)
            {
                // 释放托管资源
            }
            
            // 释放非托管资源
            _disposed = true;
        }
    }
    
    ~PluginBase()
    {
        Dispose(false);
    }
}

通过这样的架构设计和接口规范,EverythingToolbar的插件系统能够提供高度可扩展、稳定可靠的插件开发体验,同时确保与主应用程序的无缝集成和协同工作。

自定义搜索过滤器的开发方法

EverythingToolbar提供了强大的自定义搜索过滤器功能,允许用户根据特定需求创建个性化的搜索条件。通过深入了解过滤器的工作原理和实现机制,开发者可以创建高度定制化的搜索体验。

过滤器核心架构

EverythingToolbar的过滤器系统基于一个精心设计的类结构,主要通过Filter数据模型和FilterLoader加载器来实现:

// Filter 数据模型定义
public class Filter
{
    public string Name { get; set; }          // 过滤器显示名称
    public string Icon { get; set; }          // 过滤器图标
    public bool IsMatchCase { get; set; }     // 是否区分大小写
    public bool IsMatchWholeWord { get; set; }// 是否全字匹配
    public bool IsMatchPath { get; set; }     // 是否匹配路径
    public bool IsRegExEnabled { get; set; }  // 是否启用正则表达式
    public string Search { get; set; }        // 搜索条件
    public string Macro { get; set; }         // 宏定义
}

过滤器加载机制

系统通过FilterLoader类管理过滤器的加载和更新,支持从Everything的Filters.csv文件自动导入:

mermaid

CSV文件格式规范

EverythingToolbar遵循Everything的Filters.csv格式标准,文件结构如下:

字段名类型描述示例值
Namestring过滤器名称"文档文件"
Caseint区分大小写(0/1)0
Whole Wordint全字匹配(0/1)0
Pathint匹配路径(0/1)0
Regexint正则表达式(0/1)0
Searchstring搜索条件"ext:doc;docx;pdf"
Macrostring宏名称"doc"

创建自定义过滤器

方法一:直接编辑Filters.csv

在Everything的配置目录(通常是%APPDATA%\Everything)中找到或创建Filters.csv文件:

# 自定义文档过滤器
Name,Case,Whole Word,Path,Regex,Search,Macro
我的文档,0,0,0,0,ext:doc;docx;pdf;txt,mydocs
代码文件,0,0,0,0,ext:cs;java;py;js;html;css,code
图片文件,0,0,0,0,ext:jpg;jpeg;png;gif;bmp,images
方法二:通过程序化创建

开发者也可以通过代码动态创建过滤器:

// 创建自定义过滤器示例
var customFilter = new Filter
{
    Name = "开发项目",
    Icon = "\xE7C3  ", // 文件图标
    IsMatchCase = false,
    IsMatchWholeWord = false, 
    IsMatchPath = true, // 包含路径搜索
    IsRegExEnabled = false,
    Search = "path:projects ext:csproj;sln",
    Macro = "devproj"
};

// 添加到过滤器集合
var filters = FilterLoader.Instance.UserFilters;
filters.Add(customFilter);

高级过滤器配置

正则表达式过滤器
# 使用正则表达式的高级过滤器
Name,Case,Whole Word,Path,Regex,Search,Macro
日志文件,0,0,1,1,\.log$,logfiles
版本控制,0,0,1,1,\.git/,gitfiles
临时文件,0,0,1,1,tmp$|temp$,tempfiles
组合搜索条件
# 组合多个搜索条件的复杂过滤器
Name,Case,Whole Word,Path,Regex,Search,Macro
大尺寸图片,0,0,0,0,ext:jpg;jpeg;png size:>5MB,largeimages
近期文档,0,0,0,0,ext:doc;docx;pdf dm:today,recentdocs
系统文件,0,0,1,0,path:C:\Windows attrib:S,systemfiles

过滤器集成与使用

在EverythingToolbar界面中,过滤器通过FilterSelector控件呈现:

<!-- FilterSelector XAML 定义 -->
<UserControl x:Class="EverythingToolbar.Controls.FilterSelector"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <ComboBox x:Name="FilterComboBox"
              ItemsSource="{Binding Filters}"
              SelectedItem="{Binding SelectedFilter}"
              ToolTip="{Binding SelectedFilter.Name}"
              Style="{StaticResource FilterComboBoxStyle}"/>
</UserControl>

最佳实践建议

  1. 命名规范:使用清晰、描述性的名称,便于用户识别
  2. 图标选择:为常用过滤器添加适当的图标标识
  3. 性能优化:避免过于复杂的正则表达式,影响搜索性能
  4. 错误处理:在自定义过滤器中包含适当的错误检查机制
  5. 兼容性:确保过滤器语法与当前Everything版本兼容

调试与测试

开发自定义过滤器时,可以使用以下调试技巧:

// 调试过滤器加载过程
private ObservableCollection<Filter> LoadFilters()
{
    var filters = new ObservableCollection<Filter>();
    // ... 加载逻辑
    Logger.Info($"成功加载 {filters.Count} 个过滤器");
    foreach (var filter in filters)
    {
        Logger.Debug($"过滤器: {filter.Name}, 搜索条件: {filter.Search}");
    }
    return filters;
}

通过掌握这些自定义搜索过滤器的开发方法,你可以为EverythingToolbar创建强大而灵活的搜索功能,显著提升用户的文件搜索体验。

文件操作规则的扩展实现

EverythingToolbar的文件操作规则系统是一个强大而灵活的扩展机制,允许用户根据文件类型和正则表达式模式自动执行自定义命令。这个功能极大地扩展了Everything搜索工具的能力,使其从一个简单的文件搜索工具转变为一个智能的文件操作平台。

规则系统架构设计

文件操作规则系统的核心架构基于以下几个关键组件:

// 规则数据结构定义
public class Rule : INotifyPropertyChanged
{
    public string Name { get; set; }          // 规则名称
    public FileType Type { get; set; }        // 文件类型:Any、File、Folder
    public string Expression { get; set; }    // 正则表达式模式
    public string Command { get; set; }       // 执行的命令
    public bool ExpressionValid { get; }      // 表达式有效性检查
}

public enum FileType
{
    Any,    // 任何类型
    File,   // 仅文件
    Folder  // 仅文件夹
}

系统采用XML序列化机制来持久化存储规则配置,确保用户定义的规则在应用程序重启后仍然有效。配置文件存储在用户配置目录下的rules.xml文件中。

规则匹配与执行流程

文件操作规则的执行遵循一个精心设计的流程,确保高效且准确地匹配和执行用户定义的命令:

flowchart TD
    A[搜索结果显示] --> B{是否启用自动规则}
    B -- 否 --> C[正常处理]
    B -- 是 --> D[遍历所有规则]
    
    D --> E{规则匹配检查}
    E --> F[正则表达式匹配]
    E --> G[文件类型匹配]
    
    F --> H{两者都匹配?}
    G --> H
    
    H -- 是 --> I[执行对应命令]
    H -- 否 --> J[继续下一个规则]
    
    I --> K[命令执行成功]

【免费下载链接】EverythingToolbar 【免费下载链接】EverythingToolbar 项目地址: https://gitcode.com/gh_mirrors/ev/EverythingToolbar

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值