每天打字打到手腕疼的时候,我就在想,这世上有多少重复输入是可以省掉的。
邮箱地址、公司全称、常回的客服话术、固定格式的日期时间、甚至那个该死的邮箱签名——这些东西每天敲几十遍,每个字都是多余的。

后来在 GitHub 上翻到一个叫 espanso 的项目,用了一段时间,觉得值得好好聊聊。

01
文本扩展是个什么东西
文本扩展(Text Expander)这个概念不新。macOS 上有个商业软件叫 TextExpander,一年要收几十美金。Windows 上有 PhraseExpress,也有人用 AutoHotkey 凑合。
原理很简单:你设一个关键词,比如「:hi」,敲完它,软件自动把这几个字母替换成「你好,我是XX公司的XXX,很高兴认识你」。
听起来不起眼。但用上手之后会发现,这种省力是全身性的——你不再需要切到记事本找模板复制粘贴,不需要在浏览器里翻收藏夹找邮箱,不需要记住哪个格式的日期时间该怎么手敲。
打几个字母,剩下的交给软件。

espanso 2025 版演示,关键词触发即时替换
02
为什么是 espanso
同类工具不少,espanso 有几个地方不太一样。
跨平台,Windows、macOS、Linux 全支持。这一点直接干掉了一大半竞品。TextExpander 只有 macOS,PhraseExpress 的 Mac 版半死不活,AutoHotkey 是 Windows 独占。在三个系统之间切换的人,espanso 是少有的选择。
100% 本地,不联网。配置文件是本地 YAML,数据不离开你的电脑。没有账号,没有云同步,没有「我们收集了你的使用数据来改善体验」。在这个什么都要上云的年代,这种克制让人安心。
用 Rust 写的。这点不是技术炫耀。Rust 编译出来的二进制文件小、内存占用低、运行速度快。一个常驻后台监听键盘输入的工具,不应该吃 200MB 内存。espanso 不会。
和几乎所有软件兼容。它在系统层面拦截键盘事件,不依赖特定 API 或无障碍接口。这意味着浏览器、终端、代码编辑器、甚至远程桌面里的输入,它都能管。这个兼容性是很多竞品做不到的。
03
配置长什么样
espanso 的配置是纯 YAML 文件,没有图形界面。这点见仁见智,但对程序员来说反而是优点。
最基本的写法长这样:
matches:
- trigger: ":hi"
replace: "你好,我是张三"
- trigger: ":mail"
replace: "zhangsan@example.com"
- trigger: ":date"
replace: "{{date}}"
vars:
- name: date
type: date
params:
format: "%Y-%m-%d"
敲「:hi」自动变成「你好,我是张三」。敲「:date」变成今天的日期。变量、日期格式、时区都支持,v2.3.0 之后时区可以直接写 IANA 格式,比如「Asia/Shanghai」。
配置文件可以拆分到多个 YAML,按类别管理。比如邮件一个文件、代码片段一个文件、emoji 一个文件。改完保存即生效,不用重启。
04
不只是替换文本
如果只是替换文本,AutoHotkey 也能干。espanso 多了几层东西。
Shell 命令和自定义脚本。触发关键词的时候,不只是替换成固定文本,可以执行 shell 命令,把输出注入到光标位置。比如设一个「:ip」,触发后执行 curl ifconfig.me,直接把你的公网 IP 贴到当前输入框里。不用切到终端复制粘贴了。
搜索栏。快捷词设多了记不住?按 Alt+Space 唤出搜索栏,模糊搜索你的所有片段。这个设计很聪明——你不需要记住几十个触发词,只需要记住 Alt+Space。
Forms。v2 之后加了表单功能,触发关键词后弹出一个表单,填几个字段,值会被填入模板的对应位置。客服回复、邮件模板这种需要填变量的场景,用表单比硬写模板灵活得多。
应用级配置。不同软件可以走不同的替换规则。在代码编辑器里敲「:todo」展开成一段 TODO 注释,在 Slack 里同样的词展开成给同事看的消息。同一个关键词,不同语境不同输出。
包管理器。espanso 有自己的 Hub(hub.espanso.org),可以一键安装社区贡献的包。德语重音符号、数学符号、emoji 全家桶、甚至 XSS payload 模板,都有人打包好了。一行命令安装。
05
谁在维护,还活着吗
开源项目最怕的就是没人维护。espanso 在这一点上还行。
项目由 Federico Terzi 创建,现在有一个五人的维护团队,Lead Maintainer 是 Auca。1649 次提交,14,000+ star,510 个 issue——有的已关闭,有的还在排期。
最新版 v2.4.0 上个月刚发布,重点是 Linux Wayland 兼容性、macOS 稳定性修复和依赖安全升级。v2.3.0 加了时区选择、Markdown 渲染引擎换成了 pulldown-cmark。从版本节奏看,项目在持续迭代,不是那种两年没更新的僵尸仓库。
社区活跃度也不错。Discord 有服务器,Reddit 有 subreddit,GitHub Discussions 有人提功能建议也有人回。开发者、安全研究员、客服、销售都有人在用——因为重复输入这件事,不分行业。
06
该不该用
说了这么多,回到一个实际问题:什么人该装这个。
如果你每天有超过十次输入同一段文字——邮件签名、固定回复、代码模板、地址电话——那装一个试试不亏。
如果你是程序员,espanso 的 YAML 配置 + 脚本扩展 + 包管理器,基本就是给你设计的。
如果你跨平台办公,在 Windows 和 Mac 之间切,espanso 可能是唯一一个两边都能用、配置还能同步的选择。
重复劳动不是努力的证明,是工具没到位。
项目地址:
github.com/espanso/espanso
GPL-3.0 协议,Windows、macOS、Linux 全平台,免费。装完花十分钟写几条规则,接下来几年里每天省下来的那几十秒,就是它给你的回报。
07
完整模板办公+程序员
base.yml配置文件内容
# ====================== Espanso base.yml 完整模板 办公+程序员 ======================
matches:
# ========== 基础个人信息 ==========
- trigger: ":name"
replace: "小明"
- trigger: ":phone"
replace: "13800138000"
- trigger: ":mail"
replace: "demo@example.com"
- trigger: ":addr"
replace: "江苏省苏州市昆山市XX路XX号
邮编:215300"
- trigger: ":sig"
replace: "此致
敬礼
小明
电话:13800138000
邮箱:demo@example.com"
# ========== 日期时间模板 ==========
- trigger: ":date"
replace: "{{now}}"
vars:
- name: now
type: date
params:
format: "%Y-%m-%d"
- trigger: ":datetime"
replace: "{{now}}"
vars:
- name: now
type: date
params:
format: "%Y-%m-%d %H:%M:%S"
- trigger: ":todaycn"
replace: "{{now}}"
vars:
- name: now
type: date
params:
format: "%Y年%m月%d日"
- trigger: ":week"
replace: "{{now}}"
vars:
- name: now
type: date
params:
format: "%Y-%m-%d %A"
# ========== Markdown 写作模板 ==========
- trigger: ":mdlink"
replace: "[{{cursor}}](https://)"
- trigger: ":mdimg"
replace: ""
- trigger: ":mdcode"
replace: "```{{cursor}}
```"
- trigger: ":mdtbl"
replace: "| 字段 | 说明 |
| ---- | ---- |
| {{cursor}} | |"
- trigger: ":mdquote"
replace: "> {{cursor}}"
# ========== Git 提交模板 ==========
- trigger: ":gitfeat"
replace: "feat: {{cursor}} 新增功能"
- trigger: ":gitfix"
replace: "fix: {{cursor}} 修复问题"
- trigger: ":gitdocs"
replace: "docs: {{cursor}} 更新文档"
- trigger: ":gitref"
replace: "refactor: {{cursor}} 代码重构"
- trigger: ":gitstyle"
replace: "style: {{cursor}} 格式调整,无逻辑变更"
# ========== SQL 常用片段 ==========
- trigger: ":sqlsel"
replace: "SELECT * FROM {{cursor}} WHERE 1=1;"
- trigger: ":sqlcount"
replace: "SELECT COUNT(*) FROM {{cursor}} WHERE 1=1;"
- trigger: ":sqlupd"
replace: "UPDATE {{cursor}} SET "
- trigger: ":sqlins"
replace: "INSERT INTO {{cursor}}() VALUES();"
# ========== JS / TS 代码片段 ==========
- trigger: ":log"
replace: "console.log('{{cursor}}');"
- trigger: ":func"
replace: "function {{cursor}}() {
}"
- trigger: ":arrow"
replace: "const {{cursor}} = () => {
}"
# ========== 运维 Shell 片段 ==========
- trigger: ":psgrep"
replace: "ps -ef | grep {{cursor}}"
- trigger: ":curlget"
replace: "curl -X GET '{{cursor}}'"
# ========== 剪贴板快速输出 ==========
- trigger: ":cb"
replace: "剪贴板内容:{{cb}}"
vars:
- name: cb
type: clipboard
# ========== 弹窗选择模板 ==========
- trigger: ":greet"
replace: "{{sel}}"
vars:
- name: sel
type: choice
params:
options:
- 您好!
- 收到,我稍后查看。
- 好的,没问题。
- 辛苦啦,谢谢!
# ========== 表单弹窗模板(工单) ==========
- trigger: ":ticket"
replace: "【工单】
标题:{{title}}
描述:{{desc}}
优先级:{{level}}"
vars:
- name: formdata
type: form
params:
fields:
- name: title
label: 工单标题
- name: desc
label: 问题描述
- name: level
label: 优先级(高/中/低)
# ========== 办公沟通短句 ==========
- trigger: ":okmsg"
replace: "收到,我这边确认一下,稍后回复。"
- trigger: ":waitmsg"
replace: "稍等,正在处理,处理完同步给你。"
- trigger: ":donemsg"
replace: "已完成,请查看,如有问题随时沟通。"
- trigger: ":meeting"
replace: "会议时间:{{cursor}}
参会人:
议题:"default.yml推荐配置(可选)
# default.yml
# 触发分隔符,输入缩写后按空格/tab/回车触发
trigger_shortcuts:
- space
- tab
- enter
# 是否区分大小写
ignore_case: false
# 单词边界,防止在单词中间误触发
word_boundary: true
# 不启用的应用(示例:VS Code 内禁用,按需开启)
# exclude_apps:
# - "Code"
# 最大等待时间
backspace_limit: 5
# 自动补全提示(可选)
enable_suggestions: true修改后重新重载配置
更新时间:2026-09-19
本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828
© CopyRight All Rights Reserved.
Powered By 61893.com 闽ICP备11008920号
闽公网安备35020302034844号