最小可用.sublime-snippet文件需满足三要素:后缀为.sublime-snippet、存于Packages/User/目录、内容为含、和的合法XML,缺一不可。

Sublime 的代码片段不是“设了就能用”,关键在于 .sublime-snippet 文件是否合法、位置是否正确、scope 是否匹配当前语法——三者缺一不可,否则输再多次 Tab 都没反应。
如何创建一个最小可用的 .sublime-snippet 文件
别从头手写 XML,用菜单生成最稳妥:Tools → Developer → New Snippet…,它会输出带 <snippet></snippet> 根节点的模板。你只需填三样东西:
-
<content></content>:必须用CDATA包裹,否则换行、、<code>&会解析失败 -
<tabtrigger>log</tabtrigger>:触发词,不能含空格或特殊字符(如console.log就不行) -
<scope>source.js</scope>:限定生效范围,不加则全局可用,但容易误触发
漏掉 tabTrigger 或 content 中的 CDATA,文件会被 Sublime 静默忽略。
为什么写了 snippet 却按 Tab 没反应
90% 的失效源于 scope 不匹配。Sublime 不看文件后缀,只认当前语法作用域(syntax scope),比如:
- Vue 单文件组件的
<script></script>块里,scope 很可能是source.js.embedded.html,不是source.js - JSX 文件常用
source.js.jsx,TypeScript 是source.ts - HTML 模板统一用
text.html.basic,别写成html或text/html
查真实 scope:按 Ctrl+Shift+P(Win/Linux)或 Cmd+Shift+P(Mac)→ 输入 Developer: Show Scope Name,状态栏显示的就是当前光标处的完整 scope 链,复制粘贴进 <scope></scope> 字段即可。
怎么让占位符支持跳转、默认值和同步修改
占位符不是装饰,是编辑流的核心控制点:
-
$1是第一个跳转位,$2是第二个,依次类推;$0是最终光标位置,必须有且只能有一个 -
${1:default}表示带默认值的占位符,Tab 跳过时保留default;留空${1:}则跳过时不填 - 同一变量重复出现,如
function ${1:name}() { ... ${1:name} ... },首次输入后其余位置自动同步更新 - 想插入真实美元符号?写成
\$,否则会被当成占位符解析
跳转位编号必须连续($1、$2、$3),断号会导致后续跳转失效或光标错乱。
文件放哪才真正生效
Sublime 只加载 Packages/User/ 目录下的 .sublime-snippet 文件,其他路径一律无效:
- Windows 路径示例:
%APPDATA%\Sublime Text\Packages\User\ - macOS:
~/Library/Application Support/Sublime Text/Packages/User/ - Linux:
~/.config/sublime-text/Packages/User/
最稳妥方式:Preferences → Browse Packages… → 进入 User 文件夹新建文件。存成 log-js.sublime-snippet 可以,存成 log-js.txt 或 log-js.sublime-snippet.bak 就完全不识别。
scope 写错、文件放错位置、漏 CDATA 或 $0,这四点最容易被忽略,但任意一个出问题,整个 snippet 就等于不存在。

















