自定义 snippets 必须放在 packages/user/ 目录下且文件名以 .sublime-snippet 结尾,scope 需匹配当前语法(如 source.js.embedded.html),tabtrigger 仅支持字母数字下划线,cdata 中 $ 要转义为 \$,且必须包含 $1 和 ${0} 占位符。

自定义 Snippets 放在 Packages/User/ 目录下才生效,其他路径(包括子目录、桌面、项目根目录)全部无效;scope 写错或未转义 $ 字符会导致片段“静默失效”——输对触发词也没反应,这是最常卡住的两个点。
为什么输入 tabTrigger 后完全没反应
绝大多数“不生效”不是代码问题,而是环境配置错位:
- 文件没放对位置:必须是
Packages/User/xxx.sublime-snippet,不能是Packages/User/Snippets/xxx.sublime-snippet(Sublime 不递归扫描子目录) -
tabTrigger含非法字符:比如设成console.log或my-log,Sublime 会直接忽略整个文件;只能用字母、数字、下划线,且区分大小写 - 当前文件语法不匹配
scope:例如片段写了<scope>source.js</scope>,但右下角显示的是Plain text或Vue Component,它就不会加载 - 控制台有报错:按
Ctrl+`打开控制台,看是否有error loading snippet类提示,通常暴露了 XML 格式或路径问题
如何确认当前文件支持哪些 Snippets
别猜、别翻文档,直接查实时可用列表:
- 按
Ctrl+Shift+P(Win/Linux)或Cmd+Shift+P(macOS),输入Insert Snippet回车 - 弹出菜单里显示的每一项,格式为
HTML: div或Python: for,冒号前是当前匹配的语法,冒号后才是可用的tabTrigger - 如果某个词没出现,优先检查右下角语法名是否正确;Vue 单文件组件中
<script></script>块的真实 scope 是source.js.embedded.html,不是source.js - 这个菜单只显示“已启用 + 语法匹配”的片段,比任何教程都准
自定义 Snippet 必须填全的三个字段
缺任意一个,Sublime 就会静默跳过该文件,不会报错也不会提示:
-
<content></content>:必须用CDATA包裹,否则 XML 特殊字符(如、<code>&)会解析失败;含$字符要写成$ -
<tabtrigger>clg</tabtrigger>:纯文本关键字,不能带空格或点号;多个 snippet 用相同tabTrigger时,按文件名 ASCII 序最后一个生效 -
<scope>source.js</scope>:必须用 Sublime 内部作用域名,不是语言简称;可逗号分隔多个,如source.js, source.ts;不写则全局生效,极易误触
占位符 $1 $2 ${0} 不是可选技巧,是硬性要求
没有它们,插入后光标卡死,无法继续编码:
-
$1是第一个跳转位,$2是第二个……数字顺序决定 Tab 跳转路径;重复编号(如两个$1)只保留第一个 -
${0}是终点光标位置,必须显式写出;写成$0(无花括号)会被 Sublime 忽略,光标停在上一个$N上不动 -
${1:msg}表示默认值为msg的占位字段,Tab 到这儿可直接编辑或回车跳过;${selection}可包裹当前选中文本 - 常见坑:
console.log('$1');后漏掉${0},结果插入完光标停在分号后,没法立刻敲回车或续写
真正容易被忽略的是 scope 的嵌套场景——比如 Markdown 文件里的代码块、Vue 的 <script setup></script>、TSX 中的 JSX 部分,它们的作用域都不是基础语言名,得用 Show Scope Name 实时查。靠猜或复制别人配置,大概率失效。











