sublime text 的 .sublime-snippet 文件必须置于 packages/user/ 目录下才生效,后缀须为 .sublime-snippet;tabtrigger 冲突时以最后修改者为准;scope 错误将导致片段仅在纯文本模式可用;变量如 $1 需处于 cdata 顶层文本流中才可跳转。

Snippet 文件必须放在 Packages/User/ 目录下才生效
Sublime Text 不会自动加载任意位置的 .sublime-snippet 文件。你新建的片段如果放错地方,比如桌面、项目根目录或 Packages/MyPlugin/,它压根不会出现在补全列表里。
实操建议:
- 用菜单 Preferences → Browse Packages… 打开目录,直接进入
Packages/User/ - 文件名随意,但后缀必须是
.sublime-snippet(注意不是.snippet或.xml) - 改完文件不用重启 Sublime,保存即生效;但若之前已打开同名 snippet,需手动删掉缓存(见下一条)
tabTrigger 冲突时,Sublime 优先加载「最后修改」的 snippet
多个 snippet 设了相同的 tabTrigger(比如都设成 log),Sublime 不报错,也不提示,而是静默采用「文件系统中最后被修改的那个」——这导致你改了 A.snippet,却发现触发的还是 B.snippet 的内容,非常迷惑。
常见错误现象:
- 明明刚保存了新 snippet,按
tab却插入旧内容 - 删除了一个 snippet 文件,
tabTrigger还能触发,说明有另一个同名 trigger 潜伏着
排查方法:
- 在
Packages/User/里搜索所有含<tabtrigger>log</tabtrigger>的文件(用 VS Code 或系统搜索) - 检查文件修改时间,删掉过期或重复的
- 临时重命名其他 snippet(如加
_bak),再测试
scope 属性决定 snippet 在哪种语法下可用
没写 scope,或写错了 scope,你的 snippet 就只在「纯文本」模式下生效——写 JavaScript 时敲 for 触发不了 for 循环片段,大概率是 scope 没配对。
常用 scope 值(区分大小写,且常带前缀):
- JavaScript:
source.js - TypeScript:
source.ts - Vue SFC script 块:
source.vue meta.script.js - Markdown 代码块内:
text.html.markdown source.js
验证当前 scope 的快捷方式:
- 按下
Ctrl+Shift+P(Win/Linux)或Cmd+Shift+P(Mac) - 输入并运行
View Package File→ 选Global Settings – Default - 看右下角状态栏显示的 scope(如
source.js meta.function.js)
变量和占位符嵌套容易导致 $1 变成字面量
写 $1 是想留个光标位置,但如果它出现在双引号字符串里、或被其他变量包裹,Sublime 会当普通文本输出,而不是可跳转的 tab stop。
正确写法示例(定义一个 console.log snippet):
<content></content>
错误写法(会导致 $1 原样输出):
<content></content>
原因:XML CDATA 区域内不解析变量;双引号也不是问题,关键是 $1 必须处于顶层 content 文本流中,不能被额外引号或标签包裹。
其他易踩点:
-
$0表示最终光标位置,只能出现一次 -
${1:default}支持默认值,但冒号前后不能有空格 - 避免用
$开头的自定义变量名(如$myvar),Sublime 可能误识别
scope 和 tabTrigger 的组合行为比表面看起来更脆弱,改一处常要连带查三处——尤其是团队共用 snippet 时,别轻信“别人说能用”。











