sublime text 的 snippet 必须放在 packages/user/ 目录下,且需正确设置 scope、tabtrigger 和 cdata 包裹 content,否则不会生效;修改后执行 reload syntaxes 即可刷新,无需重启。

Snippet 文件必须放在 Packages/User/ 目录下
放错位置就等于没写。Sublime 只扫描这个固定路径,其他地方(比如桌面、项目根目录、Packages/JavaScript/)的 .sublime-snippet 文件完全不会被加载。
Windows 路径:%APPDATA%\Sublime Text\Packages\User\
macOS:用 Preferences → Browse Packages… 直接跳转
Linux:~/.config/sublime-text/Packages/User/
- 别用中文路径或带空格的文件名——部分 Sublime Text 4 版本会静默跳过
- 文件名建议和
tabTrigger一致,比如触发词是log,就保存为log.sublime-snippet - 改完后不用重启,执行
Ctrl+Shift+P→ 输入Reload Syntaxes即可刷新缓存
scope 写错 = 完全没反应
底部状态栏显示的是 Plain text 或 HTML (Twig),而你的 snippet 写了 <scope>source.js</scope>?那输再多遍 log + Tab 都不会展开。
查当前 scope 的正确方式:Ctrl+Shift+P(Win/Linux)或 Cmd+Shift+P(Mac)→ 输入 show_scope_name 回车,状态栏会显示类似 source.js meta.function.js 的字符串。
- 常用 scope 值:
source.js、source.jsx、text.html.basic、source.css - 多个 scope 用逗号分隔,但逗号后不能有空格:
source.js,source.ts✅|source.js, source.ts❌ - 删掉
<scope></scope>标签可全局生效,但容易和 Emmet 或其他 snippet 冲突,慎用
<content></content> 必须用 包裹
不加 CDATA,XML 解析器遇到 {、 就直接报错跳过加载,且不提示任何错误信息——你只会觉得“怎么不生效”。
占位符用 $1、$2,不是 ${1:default};后者只在需要默认值时才加,过度使用反而让跳转逻辑变复杂。
- 缩进会被原样插入:想顶格写就顶格,想缩进两格就手动敲两个空格——别用
Tab键,它在 snippet 编辑中是跳转符 - 换行符也原样保留,所以
\n展开后就是带换行的结构 - 新建 snippet 务必通过
Ctrl+Shift+P→Tools: New Snippet调出模板,不要“新建文本文件 → 改后缀”,否则缺根节点和 CDATA,Sublime 直接忽略
常见错误现象与排查顺序
输入 tabTrigger 后按 Tab 没反应?先查这三件事:
-
tabTrigger值只能含字母、数字、下划线,比如http-get❌|http_get✅ - 当前文件语法是否匹配 scope?右键编辑区 → Set Syntax → 选对语言(如 JavaScript)
- 打开控制台(
Ctrl+`)看有没有XML parse error提示
最常被忽略的一点:snippet 的本质是“文本插入”,不是“逻辑执行”。它不读取变量、不调 API、不执行 JS —— 截至 2026 年 8 月,它仍是纯静态 XML 替换机制。











