Steno:DSH 消息内联快捷方式展开插件

前言

在 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。

  1. 安装插件:
dsh plugin --profile demo add github:JohnXu22786/snippet-expander
  1. 初始化配置文件:
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
羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

小夜