创建可立即使用的最小代码片段需满足三条件:存于packages/user/目录、.sublime-snippet后缀、语法作用域完全匹配;用tools→developer→new snippet…生成模板,仅填内$1→$2→$0跳转位、${1:default}默认值、\$输出美元符,且占位符须在顶层文本流中。

Sublime 的代码片段不是“保存就生效”,三件事必须同时满足:Packages/User/ 目录下、.sublime-snippet 后缀、<scope></scope> 与当前文件真实语法作用域完全匹配——缺一不可,否则按 Tab 就是静默失败。
怎么创建一个能立刻用的最小 snippet
别手写 XML,用内置模板最稳:菜单栏 Tools → Developer → New Snippet…,它会生成带 <snippet></snippet> 根节点的框架。你只需填三样:
-
<content></content>:必须用包裹,否则换行、、<code>&全解析错 -
<tabtrigger>log</tabtrigger>:触发词只能是字母/数字/下划线,不能含点号或空格(console.log不行,log可以) -
<scope>source.js</scope>:限定只在 JS 文件生效;留空则全局可用,但容易在 Markdown 里误触发
保存时确认后缀是 .sublime-snippet(不是 .txt 或 .xml),路径必须是 Packages/User/ ——用 Preferences → Browse Packages… 打开目录再存,比手动找路径靠谱十倍。
为什么写了 snippet 却按 Tab 没反应
90% 是 <scope></scope> 错了。Sublime 不看文件后缀,只认光标所在位置的语法作用域(syntax scope)。比如:
- Vue 单文件组件的
<script></script>块里,scope 很可能是source.vue meta.script.js,不是source.js - HTML 文件里内联的
<script></script>,常用source.js.embedded.html - JSX 文件要用
source.js.jsx,TSX 用source.tsx
查真实 scope 的唯一办法:Ctrl+Shift+P(Win/Linux)或 Cmd+Shift+P(Mac)→ 输入 Developer: Show Scope Name,状态栏显示的字符串直接复制进 <scope></scope> 字段即可。
让 snippet 支持选中内容包裹和多光标跳转
想用 snippet 把选中的文字包进 console.log()?关键在 $SELECTION:
- 先选中文本,再按 Tab,
$SELECTION才有值;没选就按 Tab,它就是空字符串 - 正确写法:
,$0必须有且只能有一个 - 跳转位编号必须连续:
$1→$2→$0;漏掉$1只写$2,Tab 会跳过第一个空位甚至卡死 - 默认值写成
${1:defaultValue},留空用${1:};要输出真实美元符号,必须写\$
占位符必须处于 的顶层文本流中——不能嵌在注释里、不能当属性值、不能缩进在 XML 标签内,否则 $1 就变成纯文本,光标根本不会跳过去。
多个同名 tabTrigger 导致行为混乱
Sublime 不报错,也不提示,而是静默采用「最后修改时间最晚」的那个 snippet。现象是:你刚改完 log-js.sublime-snippet,按 Tab 却插出旧内容。
- 排查方法:在
Packages/User/目录下用系统搜索查<tabtrigger>log</tabtrigger> - 删掉所有重复项,或临时重命名其他 snippet(如加
_bak)再测试 - 修改后不用重启 Sublime,但若之前已打开同名 snippet 文件,得先关掉再试,否则可能读缓存
真正容易被忽略的点是 scope 的“嵌套性”——比如 source.js.embedded.html 和 source.js 是两个不同 scope,前者不会匹配后者定义的 snippet,哪怕内容完全一样。写 scope 时宁可多查一次 Show Scope Name,也别凭经验硬猜。











