1. 为什么需要应用专属的文本补全规则
在日常工作中,我们经常遇到这样的场景:同一个文本缩写,在不同应用中需要展开成不同的内容。比如在邮件客户端输入":sig"可能希望展开为正式的公司签名,而在聊天软件中可能只需要简短的姓名缩写。这就是espanso的filter_exec和extra_includes功能大显身手的地方。
espanso作为一款跨平台的文本扩展工具,其强大之处在于可以根据当前焦点应用动态调整补全规则。想象一下这样的工作流:
- 在VS Code中输入":pyfor"自动展开为Python的for循环模板
- 在Chrome地址栏输入相同的":pyfor"却没有任何反应
- 在Slack中":thanks"展开为英文感谢语,而在微信中却展开为中文感谢语
这种智能的上下文感知能力,正是通过应用专属配置实现的。它不仅避免了误触发,还能针对不同场景提供最合适的文本扩展。
2. 配置应用专属补全的核心要素
2.1 理解filter_exec的工作原理
filter_exec是espanso识别当前应用的钥匙。它的值应该是目标应用的进程名或窗口标题。在Windows上可以通过任务管理器查看进程名,在macOS上可以使用以下命令获取当前前台应用的信息:
osascript -e 'tell application "System Events" to get name of first application process whose frontmost is true'Linux用户则可以使用xprop工具:
xprop -id $(xdotool getactivewindow) WM_CLASS常见应用的filter_exec值示例:
- VS Code: "Code" (Windows/Linux) 或 "Visual Studio Code" (macOS)
- Chrome: "chrome" (Windows/Linux) 或 "Google Chrome" (macOS)
- Slack: "slack" (全平台)
2.2 组织你的补全规则文件
合理的文件结构是管理复杂补全规则的基础。建议采用这样的目录结构:
~/.config/espanso/ ├── config/ │ ├── chrome.yml # Chrome专属配置 │ ├── vscode.yml # VS Code专属配置 │ └── default.yml # 默认配置 └── match/ ├── _email.yml # 邮件模板(带_表示不自动加载) ├── _code.yml # 代码片段 └── common.yml # 通用补全规则带下划线前缀的文件(_email.yml)不会被自动加载,需要通过extra_includes显式引入,这给了我们更精细的控制权。
3. 实战:为VS Code配置专属代码片段
3.1 创建代码片段文件
首先在match目录下创建_code.yml:
# ~/.config/espanso/match/_code.yml matches: - trigger: ":pyfor" replace: | for i in range(10): {{cursor}} vars: - name: cursor type: cursor注意文件名带下划线,这样它不会自动加载干扰其他应用。
3.2 配置VS Code专属规则
创建config/vscode.yml:
# ~/.config/espanso/config/vscode.yml filter_exec: "Code|Visual Studio Code" extra_includes: - "../match/_code.yml"这里使用了正则表达式"Code|Visual Studio Code"来匹配不同平台下的VS Code进程名。
3.3 验证配置效果
- 重启espanso服务使配置生效:
espanso restart - 在VS Code中键入":pyfor"应该会展开为for循环模板
- 在其他应用中键入":pyfor"应该不会有反应
4. 高级配置技巧与排错指南
4.1 处理多应用共享规则的情况
当多个应用需要共享同一组补全规则时,可以使用YAML的锚点(anchors)和引用(aliases)来避免重复:
# ~/.config/espanso/config/shared_config.yml base_config: &base extra_includes: - "../match/_shared_rules.yml" chrome_config: <<: *base filter_exec: "chrome" firefox_config: <<: *base filter_exec: "firefox"4.2 调试filter_exec匹配问题
如果应用专属规则不生效,很可能是filter_exec没有正确匹配。可以:
检查espanso日志:
espanso log在日志中搜索"Current filter"查看espanso检测到的当前应用信息。
临时修改配置增加日志输出:
filter_exec: ".*" extra_includes: - "../match/_debug.yml" log_level: debug
4.3 性能优化建议
当配置大量应用专属规则时,可能会影响espanso的响应速度。以下优化策略很实用:
合并相似应用的配置:
filter_exec: "chrome|firefox|edge"使用更精确的正则表达式避免过度匹配:
# 好 - 精确匹配VS Code主进程 filter_exec: "^Code$" # 不好 - 可能匹配到其他含"Code"的应用 filter_exec: "Code"将不常用的规则移到按需加载的带下划线文件中
5. 实际案例:为开发环境定制智能补全
5.1 终端专属命令补全
为iTerm2或Windows Terminal配置常用命令:
# ~/.config/espanso/config/terminal.yml filter_exec: "iTerm2|WindowsTerminal" extra_includes: - "../match/_terminal.yml"_terminal.yml内容示例:
matches: - trigger: ":gpush" replace: "git push origin $(git branch --show-current)" - trigger: ":dockerps" replace: "docker ps --format 'table {{.ID}}\t{{.Image}}\t{{.Status}}\t{{.Ports}}'"5.2 数据库客户端中的SQL模板
为DBeaver或TablePlus配置SQL片段:
# ~/.config/espanso/config/sql_client.yml filter_exec: "DBeaver|TablePlus" extra_includes: - "../match/_sql.yml"_sql.yml内容示例:
matches: - trigger: ":seljoin" replace: | SELECT {{table1}}.*, {{table2}}.* FROM {{table1}} JOIN {{table2}} ON {{table1}}.id = {{table2}}.{{table1}}_id WHERE {{cursor}} vars: - name: table1 type: input params: prompt: "主表名" - name: table2 type: input params: prompt: "关联表名" - name: cursor type: cursor5.3 跨平台配置同步方案
如果你在多台设备上使用espanso,可以通过以下方式保持配置同步:
- 将配置目录放入云同步服务(Dropbox, iCloud等)
- 创建符号链接:
ln -s ~/Dropbox/espanso ~/.config/espanso - 在每台设备上安装espanso时指向同一同步目录
我在实际使用中发现,将match目录按功能分类(_email.yml, _code.yml等)比按应用分类更易于维护,因为同一组片段可能被多个应用共享。同时,为每个主要应用创建独立的config文件(chrome.yml, vscode.yml)可以让配置更加清晰。
当配置不生效时,最常见的错误是filter_exec没有正确匹配应用进程名。这时查看espanso日志是最快的排错方法。另外,记得在修改配置后执行espanso restart命令使更改生效。