前言¶
在 DSH 插件生态中,Steno 专注于解决高频指令重复输入的问题。它通过 message.beforeSend 钩子,在消息发送前将 #tag 替换为预定义的完整文本。该插件由 JohnXu22786 维护,开源协议为 MIT。
核心功能¶
- 即时展开:消息中的
#tag会在发送前被替换为配置的完整文本。 - 多库管理:支持多个 YAML snippet 库,按加载顺序优先,重复标签会触发警告。
- 别名支持:单个 snippet 可绑定多个触发名称(aliases)。
- 变量占位符:支持
{{name}}和{{name:default}},由宿主提供值。 - 递归组合:snippet body 可引用其他
#tag,内置循环检测、深度限制(默认 8)和展开次数限制(默认 200)。 - 代码保护:fenced 代码块(
``)和 inline code()内的标签不会展开。 - CLI 工具:提供
steno.save、steno.remove、steno.search等命令行工具。
安装与初始化¶
安装插件需要 Node.js 版本 >= 22.18。
- 安装插件:
dsh plugin --profile demo add github:JohnXu22786/snippet-expander
- 初始化配置文件:
npx dsh-steno init
初始化后,默认配置文件位于 ~/.dsh/steno/core.yaml。
配置与用法¶
编辑 YAML 文件添加 snippet:
name: core
entries:
- tag: careful
aliases: [safe]
description: strict mode
body: |
Reason step by step, self-check before output, ask when in doubt, do not speculate.
在消息中输入 #careful,系统会自动将其替换为定义的 body 文本。
匹配规则¶
- 触发格式为
#+ tag 名称。 - Tag 必须以字母开头(区分大小写),可包含字母、数字、
_和-。 #123和 markdown 标题(如# Heading)不会被匹配。- 在中文等无空格语言中,
#tag可直接跟在汉字后(如请#专注模式)。 - 转义符
\#tag会输出字面量#tag。 - 代码块内的标签不会展开。
递归与限制¶
当 snippet body 引用其他 tag 时,插件会进行递归展开,但受到以下限制:
1. 循环检测:同一 tag 不会出现在自身展开链中。
2. 深度限制:默认最大深度为 8。
3. 次数限制:单条消息默认最多展开 200 次。
注意事项¶
- Node 版本:必须满足 Node.js >= 22.18。
- 库优先级:Library 文件按加载顺序优先,前面的文件覆盖后面的同名 tag。
- 占位符行为:
{{name}}在无值时保持原样;{{name:default}}使用默认值;占位符内部不支持 tag 展开。 - 重复标签:同一库内重复 tag 会报错;不同库内重复 tag 仅警告,使用先加载的版本。
参考资源¶
- GitHub 仓库:https://github.com/JohnXu22786/snippet-expander