sublime snippet 必须放在 packages/user/ 目录下,且 scope 必须匹配当前文件语法(如 source.js),否则静默失效;文件需 utf-8 无 bom 编码、.sublime-snippet 后缀、cdata 包裹 content、标签严格闭合、占位符规范书写。

Sublime 的 Snippet 不是“写完保存就能用”的功能,它对路径、XML 结构、作用域和编码细节极其敏感——漏掉一个点,tabTrigger 就完全静默失效,且不报错。
Snippet 文件必须放在 Packages/User/ 目录下才生效
Sublime 只扫描 Packages/User/ 下的 .sublime-snippet 文件。桌面、项目根目录、Packages/JavaScript/ 甚至 Packages/Default/ 都不会被加载。
- 最稳做法:菜单栏 Preferences → Browse Packages…,直接打开该文件夹再保存,避免手抖点错位置
- Windows 路径示例:
%APPDATA%\Sublime Text\Packages\User\ - macOS 路径示例:
~/Library/Application Support/Sublime Text/Packages/User/ - Linux 路径示例:
~/.config/sublime-text/Packages/User/ - 别用中文路径或带空格的文件名——部分 Sublime Text 4 版本会静默跳过加载
scope 写错是“输完不触发”的头号原因
你输入 log + Tab 没反应?不是 snippet 坏了,是它压根没被激活。Sublime 根据当前文件右下角显示的语法标识(如 JavaScript)匹配 <scope></scope> 值,不匹配就静默忽略。
- 查真实 scope:按
Ctrl+Shift+P(Win/Linux)或Cmd+Shift+P(Mac),输入Developer: Show Scope Name回车,状态栏显示的就是完整作用域链,例如source.vue meta.script.js - 常见值:
source.js、source.ts、text.html.basic、source.css - 支持多值叠加:
<scope>source.js, source.ts</scope> - 不区分大小写但严格匹配拼写:
source.js有效,javascript或Source.Js无效 - Vue 单文件组件的
<script></script>块不能只写source.js,得用source.vue meta.script.js
<content></content> 必须用 CDATA 包裹且 XML 合法闭合
JS 里的 {、},HTML 里的 、<code>>,不加 CDATA 会导致 XML 解析失败,整个 snippet 加载失败且无提示。
- 根节点必须是
<snippet></snippet>,所有标签成对出现:<content></content>、<tabtrigger></tabtrigger>、<scope></scope> -
<content></content>内容必须顶格写,前后不能有空行或缩进,否则插入时会多出换行或空格 - 文件后缀必须是
.sublime-snippet——Windows 默认隐藏扩展名,容易误存为log.sublime-snippet.txt,Sublime 完全无视 - 推荐用 UTF-8 无 BOM 编码保存,含中文或特殊字符时更稳妥
占位符和光标跳转怎么写才不崩
$1、$2 控制光标顺序,但容易踩坑:重复用同一个数字(比如两个 $1)会让它们变成同步字段;漏写 $0 就卡在最后一个 $N 出不来。
- 用
$1开头,按逻辑递增,别跳号($1、$2、$3) - 多个同名占位符用
${1:name}格式,比如${1:funcName}和${1:callback}会被同步编辑 - 函数体结尾固定放
$0,确保退出时不会留在中间某行 - 想输出字面量
${date},得写成\${date},否则 Sublime 会尝试解析变量 - 多行结构要手动删掉
CDATA前的首行换行、以及]]>前的末行换行,让内容紧贴CDATA
真正卡住人的从来不是语法本身,而是 scope 和路径这两个“看不见的开关”——它们一关,整个 snippet 就彻底隐身,连错误提示都没有。











