文本扩展器可以将 :cm 这样的简短触发词转换为完整的文本块,适用于任何输入场景——提交消息、PR 描述、LLM 提示词——让你不必每天重复输入相同的样板文本数十次。面向开发者的首选工具是 Espanso,这是一款免费、开源、跨平台的扩展器,使用 Rust 编写,其全部配置均为纯 YAML 格式,可纳入 git 进行版本管理。本文是一份可直接复制使用的实用手册,涵盖用于 git 操作、PR 模板和可复用 AI 提示词的真实 Espanso 片段,以及三种动态机制——Shell 输出、剪贴板注入和光标定位——它们能将静态文本转化为感知上下文的实用工具。
核心要点
- Espanso 是一款使用 Rust 编写的免费、开源、跨平台文本扩展器;在 macOS 上可通过
brew install --cask espanso(macOS 11+)安装,在 Linux 上可使用.deb包或 AppImage,在 Windows 上使用官方安装程序。 - 若要让提交片段感知上下文,可通过运行
git rev-parse --abbrev-ref HEAD的 Shell 变量注入当前分支名,这样触发词展开时始终显示你实际所在的分支。 - Espanso 通过
$|$标记在展开后定位光标,但每个匹配项只能定义一个标记,且在自动缩进的编辑器中可能出现异常——因此建议在浏览器的描述框中使用 PR 模板。 - Espanso 没有原生的”已选中文本”变量:请先复制代码,再触发读取
{{clipboard}}的片段,将高亮的函数包裹进 LLM 提示词中。 - 由于配置文件是纯 YAML 格式,你可以将整个配置目录纳入 git 仓库进行版本管理,并以私有 Espanso 包的形式在团队中共享片段。
为什么文本扩展器应该纳入你的开发工作流
文本扩展器是一类监听键盘输入、并在全系统范围内将预定义触发词替换为更长文本块(可选包含动态内容)的工具。如果你的工作需要反复输入相同的模板文本——规范化提交消息、PR 描述、常用提示词——它能立刻体现其价值。大多数人最初通过电子邮件签名接触到文本扩展器;而对于开发者而言,其回报要大得多,因为终端与 GitHub 工作流中充斥着大量样板文本。
目前主流的三款工具如下:
| 工具 | 平台 | 优势 |
|---|---|---|
| Espanso | 跨平台,开源 | 纯 YAML 配置,支持通过 Shell 和动态变量进行脚本化——本文首选 |
| Raycast Snippets | 以 macOS 为主 | 启动器功能,支持动态占位符 |
| TextExpander | 跨平台(付费) | 面向团队,支持共享填写组 |
当你需要一个可脚本化、可用 git 进行版本管理、并能在多台机器间迁移的配置时,选择 Espanso。
安装并注册后台服务:
# macOS(macOS 11+)
brew install --cask espanso
espanso service register
espanso start
在 Linux 上,官方安装文档 推荐使用 .deb 包(通过 wget 下载后执行 sudo apt install ./espanso-debian-x11-amd64.deb)或 AppImage,随后运行 espanso service register 和 espanso start;Wayland 支持目前处于实验阶段。Windows 用户请使用 espanso.org 上的安装程序。使用 espanso edit 随时编辑片段,使用 espanso restart 重新加载配置。
Discover how at OpenReplay.com.
Git 片段:展开那些你反复输入的命令
将 git 触发词存储在一个匹配文件中,让 :cm 生成一条 Conventional Commits 格式的消息,或让 :undo 展开那条你总是记不住的命令。以下是一组静态入门片段:
# ~/.config/espanso/match/git.yml
matches:
- trigger: ":cm"
replace: "feat($|$): "
- trigger: ":undo"
replace: "git reset --soft HEAD~1"
- trigger: ":unstage"
replace: "git restore --staged ."
- trigger: ":wip"
replace: "chore: wip [skip ci]"
:cm 中的 $|$ 会将光标定位在括号之间,让你直接输入 scope 后继续操作。
接下来让片段感知上下文。Espanso 的 Shell 扩展 可以执行命令并将输出插入文本,因此你可以将当前分支名注入文本中:
- trigger: ":br"
replace: "{{branch}}"
vars:
- name: branch
type: shell
params:
cmd: "git rev-parse --abbrev-ref HEAD"
在提交正文或 PR 评论中输入 :br,它会展开为 HEAD 当前指向的分支名——无需复制粘贴,也不会出现过时的分支名。
PR 模板:填空式骨架结构
:pr 触发词可以展开为包含摘要、变更、测试和截图的完整骨架,并通过 $|$ 将光标定位到第一个字段,将空白的 PR 描述框变成一个结构化表单:
- trigger: ":pr"
replace: |
## Summary
$|$
## Changes
-
## Testing
-
## Screenshots
Espanso 支持 $|$ 光标标记,但每个匹配项只能定义一个——多余的标记会被忽略——官方文档也警告称,在多行展开中该标记可能出现异常,原因是 Espanso 通过模拟左方向键来定位光标,这会与代码编辑器的自动缩进功能产生冲突。请在 GitHub 描述文本框中触发 :pr,而非在 IDE 中,这样光标定位才会可靠。
AI 提示词片段:可复用的 LLM 脚手架
像对待提交模板一样对待提示词:将 :review、:explain 和 :tests 定义一次,不再重复编写。静态版本就是纯文本:
# ~/.config/espanso/match/ai.yml
matches:
- trigger: ":explain"
replace: "Explain the following code line by line, then note any bugs or edge cases:\n\n"
- trigger: ":tests"
replace: "Write unit tests for the following code. Cover happy path and edge cases:\n\n"
更进一步的用法是注入你刚刚复制的代码。Espanso 没有原生的”已选中文本”变量,因此常用模式是先复制,再触发通过剪贴板扩展读取 {{clipboard}} 的片段:
- trigger: ":review"
replace: "Review this code for bugs, security, and readability:\n\n```\n{{clipboard}}\n```"
vars:
- name: clipboard
type: clipboard
选中一个函数,按下复制,输入 :review,即可得到一个带围栏代码块的代码审查提示词,随时可粘贴到任意模型中使用。高级用户可以在 Shell 变量中模拟复制操作——社区的变通方案 是在读取剪贴板前运行 xdotool key --clearmodifiers ctrl+c——但先复制再触发的两步操作更简单,且具有更好的跨平台兼容性。
Espanso 动态变量的工作原理
动态片段从扩展中读取其值——type: date 用于时间戳,type: shell 用于命令输出,type: clipboard 对应 {{clipboard}}——Espanso 按从上到下的顺序对变量求值,因此后面的变量可以使用前面变量的结果。根据变量文档,Shell 和脚本扩展会将当前作用域作为环境变量传入,这也是为什么 Shell 变量能够读取在其上方定义的剪贴板变量。
这种顺序机制使得组合成为可能。以下是一个用于变更日志条目的日期字段示例:
- trigger: ":today"
replace: "{{today}}"
vars:
- name: today
type: date
params:
format: "%Y-%m-%d"
Espanso 2.3.0 为日期扩展新增了 tz 参数,支持生成任意 IANA 时区的时间。将 Shell、剪贴板和日期变量组合在一个匹配项中,你就拥有了一个真正的微型工具:将剪贴板内容通过格式化器处理,添加时间戳,并将光标定位到你继续输入的位置。
将配置纳入 git 版本管理并共享
由于 Espanso 的配置是纯 YAML 格式——运行 espanso path 可查找配置目录(在 Linux 上为 ~/.config/espanso)——你可以对整个文件夹执行 git init,推送到远程仓库,并克隆到你使用的每台机器上。你的片段将成为一个有版本记录、可供审查的资产,而不是散落在各台笔记本上的零散文件。
对于团队而言,可以将共享的提交和 PR 片段发布为一个包。Espanso 支持通过 --git 选项从任意 git 仓库安装包,直接从你的托管平台拉取:
espanso install team-snippets --git https://github.com/your-org/espanso-snippets --external
团队成员只需一条命令,即可获得统一的 :cm、:pr 和 :review 规范。TextExpander 通过共享组提供了类似功能;Espanso 则借助你已经在使用的 git 工具来实现这一点。
从三个文件开始——git.yml、ai.yml 和一个 PR 骨架——提交它们,并在每次发现自己重复输入某些内容时添加新片段。配置会随着你的使用习惯不断丰富,而”先复制再触发”的剪贴板模式,是将静态扩展器转化为 git 与 AI 工作流中感知上下文的利器的核心技巧。
常见问题
Espanso 与 Raycast Snippets 和 TextExpander 有何不同?
Espanso 免费、开源、跨平台,使用纯 YAML 进行配置,可纳入 git 进行版本管理,并支持通过 Shell 和动态变量进行脚本化。Raycast Snippets 是一个以 macOS 为主的启动器功能,支持动态占位符。TextExpander 是一款付费的跨平台产品,面向团队和共享填写组场景。当你需要一个可脚本化、可用 git 进行版本管理、并能在所有机器间迁移的配置时,选择 Espanso。
片段展开后,我能将光标定位到多个位置吗?
不能。Espanso 每个匹配项只允许一个光标标记;同一替换文本中多余的 $|$ 标记会被忽略。官方文档也警告称,在多行展开中该标记可能出现异常,原因是 Espanso 通过模拟左方向键来定位光标,这会与代码编辑器的自动缩进功能产生冲突。对于 PR 骨架,请在浏览器的描述文本框中触发片段,而非在 IDE 中,这样单个光标才能可靠地落在预期位置。
Shell 扩展是否在我的项目目录中运行,使 git 命令能够正常工作?
是的。Espanso 的 Shell 扩展会在你当前的工作上下文中运行命令,因此使用 type: shell 并将 cmd 设置为 git rev-parse --abbrev-ref HEAD,返回的是你正在输入所在仓库的分支名。该扩展会将命令的标准输出插入展开文本,让 :br 这样的单个触发词能够解析为实时的分支名,无需复制粘贴,也不会出现过时的值。
Espanso 将配置存储在哪里,以便我用 git 进行版本管理?
运行 espanso path 可以打印配置目录,而不必硬编码路径,因为不同操作系统的路径有所不同。在 Linux 上通常为 ~/.config/espanso,而 macOS 使用 Application Support 路径。该目录包含纯 YAML 匹配文件,因此你可以对整个文件夹执行 git init,推送到远程仓库,并克隆到其他机器上。使用 espanso edit 编辑文件,使用 espanso restart 重新加载配置。