12k
All articles

使用文本扩展器处理 Git、PR 和 AI 提示词

面向 Git、PR 和 AI 提示词的 Espanso 片段:用 shell、剪贴板和光标提示构建上下文感知文本扩展。

OpenReplay Team
OpenReplay Team
使用文本扩展器处理 Git、PR 和 AI 提示词

文本扩展器可以将 :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 registerespanso start;Wayland 支持目前处于实验阶段。Windows 用户请使用 espanso.org 上的安装程序。使用 espanso edit 随时编辑片段,使用 espanso restart 重新加载配置。

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.ymlai.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 重新加载配置。

Understand every bug

Uncover frustrations, understand bugs and fix slowdowns like never before with OpenReplay — self-hosted, with full data ownership.

Star on GitHub

We use cookies to improve your experience. By using our site, you accept cookies.