Sublime Snippet生效需同时满足后缀为.sublime-snippet、存于Packages/User/目录、scope与当前文件真实语法作用域严格匹配三条件,缺一则静默失效;常见问题包括Windows隐藏扩展名导致误存为.txt、scope写错(如Vue中<script>块应为source.vue meta.script.js而非source.js)、CDATA未顶格或$0缺失。

Sublime 的 Snippet 不是“用了就生效”,而是“三个条件全对才动一下”——后缀、路径、scope 错一个,按 Tab 就静默失败,不报错也不提示。
Snippet 文件必须放对位置且命名正确
Sublime 只加载 Packages/User/ 目录下的 .sublime-snippet 文件,其他任何路径(桌面、项目根目录、Packages/MyPlugin/)哪怕内容完全正确,也压根不会读取。Windows 用户尤其容易被隐藏扩展名坑:存成 log.sublime-snippet.txt 实际就是个文本文件,Sublime 无视它。
- 打开
Preferences → Browse Packages…,直接进到User文件夹再保存 - 文件名必须是完整
xxx.sublime-snippet,不能少点、不能多点、不能有空格 - 编码必须是 UTF-8 无 BOM,否则 XML 解析可能失败(控制台会报错)
scope 写不对,Snippet 就等于不存在
scope 不是“语言名”,而是 Sublime 内部定义的语法作用域,写宽了或写窄了都会失效。比如你在 Vue 文件的 <script> 块里写 source.js,它根本不会触发——因为实际 scope 是 source.vue meta.script.js。
- 查真实 scope:在目标文件中把光标放到想用 snippet 的位置,按
Ctrl+Shift+P(Win/Linux)或Cmd+Shift+P(macOS),输入Developer: Show Scope Name回车 - 多语言支持用英文逗号分隔,但逗号后不能有空格:
source.js,source.ts,source.jsx - HTML 中的
<div>片段要配text.html.basic,不是html或text.html
tabTrigger 和 content 里的细节决定能不能跳转
触发词输完按 Tab 没反应?大概率是 tabTrigger 含非法字符,或 content 里 $1/$2 顺序乱了、$0 缺失或重复。
-
tabTrigger只允许小写字母、数字、下划线,http-get❌,http_get✅ -
content必须包在里,否则{、$等会被 XML 解析器吃掉 -
$0必须且只能出现一次,它是最终光标出口,不是跳转位;$1、$2控制 Tab 顺序,重复用$1会导致同步编辑 - 多行结构容易因换行缩进引入多余空格,建议
CDATA内容顶格写,或手动删掉首尾换行
改完 snippet 怎么让它立刻生效
Sublime 不自动重载 Snippet,改完不刷新,它就继续用旧缓存。重启是最稳妥的,但也可以更快:
- 命令面板输入
Reload Syntaxes(不是Reload Package)回车执行 - 如果仍不生效,打开控制台(
View → Show Console)看有没有 XML 解析错误,比如标签没闭合、引号不匹配 - 右下角显示
Plain Text时所有scope都失效,先手动设好语法类型(如JavaScript)
最常被忽略的其实是 scope 和 $0:前者决定“能不能用”,后者决定“用完停在哪”。很多人反复修改 content 却卡在 scope 拼错或 $0 漏写上,结果以为 Sublime 坏了。


















