Sublime Text 的 snippet 文件必须严格存放在 Packages/User/ 目录下、命名为 xxx.sublime-snippet、scope 精确匹配语法作用域、CDATA 中变量占位符需顶格且连续,否则静默失效。

Snippet 文件必须放在 Packages/User/ 目录下才生效
Sublime Text 只加载 Packages/User/ 下的 .sublime-snippet 文件,其他路径(比如桌面、项目根目录、Packages/MyPlugin/)哪怕内容完全正确,也压根不会识别。别手抖存错地方,更别指望“重启后自动扫描”。
获取真实路径最稳妥的方式是:菜单栏 Preferences → Browse Packages…,打开后直接进入 User 文件夹。Windows/macOS/Linux 的实际路径虽不同,但这个菜单项永远指向正确位置。
常见错误包括:
- 用资源管理器手动导航到
%APPDATA%\Sublime Text\Packages\却误点进Packages根目录,没进User子目录 - 在 Finder 或文件管理器里看到
User文件夹,双击打开却因隐藏文件设置漏掉它 - 用 VS Code 编辑 snippet 后保存到了自己项目的
snippets/目录下,忘了挪过去
文件名和后缀必须严格为 xxx.sublime-snippet
后缀不是可选的——.sublime-snippet 是硬性要求。写成 log.snippet、console-log.xml、fori.txt 或者 Windows 下常见的 log.sublime-snippet.txt(系统隐藏扩展名导致),Sublime 都会静默忽略,不报错也不提示。
命名建议:
- 全小写 + 连字符,如
log-console.sublime-snippet、fori.sublime-snippet - 避免中文、空格、点号(
.)、美元符($)等特殊字符 - 别用
if、for这类高频关键字作文件名,容易和 Emmet 或内置 snippet 冲突
最安全做法:在 Sublime 里新建文件 → File → Save As… → 输入完整名字(含 .sublime-snippet)→ 手动选中 Packages/User/ 目录保存。
scope 不匹配 = 片段完全不触发
scope 字段不是“支持的语言列表”,而是 Sublime 内部语法作用域标识符,必须和当前文件右下角显示的语法名精确匹配。比如你在 .vue 文件的 <script></script> 块里写 JS,作用域通常是 source.js.embedded.html,不是 source.js;在 Markdown 代码块里写 JS,则可能是 source.js text.html.markdown。
查准 scope 的方法:
- 按
Ctrl+Shift+P(Win/Linux)或Cmd+Shift+P(Mac),输入View Package File→ 搜索当前语法名(如JavaScript),打开其.sublime-syntax或.tmLanguage文件,找scope字段 - 装插件
ScopeAlways,状态栏实时显示当前光标处的完整 scope
多个 scope 用逗号分隔,注意不能有空格:scope: source.js,source.ts 是对的,scope: source.js, source.ts 就会失效。
content 里的 $1、$2 必须在 CDATA 顶层文本流中
变量占位符 $1、${2:default}、$0 只有在 的最外层、未被引号包裹、未嵌套在其他变量中的情况下,才能正常跳转。一旦写成 "${1:foo}" 或 ${1:"${2:bar}"},Sublime 就当普通字符串输出,光标不会停在那里。
几个关键细节:
- 编号必须连续:写了
$2就不能漏掉$1,否则 Tab 跳转会乱序甚至跳过 -
$0是最终光标停留点,不参与编号序列,但建议总加上 - 多行 content 注意缩进:首行和末行的换行符会被原样插入,若希望插入后光标对齐,CDATA 内容需顶格写,或手动删掉首尾换行
- 别在 content 里留未闭合的
${,比如${1:foo,整个文件会被静默丢弃
真正改完保存后不用重启 Sublime,但如果你之前已打开同名 snippet 并修改过,得手动删掉缓存或确认文件时间戳是否更新——因为 Sublime 会优先加载最后修改的那个同名 tabTrigger 文件,冲突时完全不提醒。

















