sublime text代码片段生效需同时满足三个条件:tabtrigger拼写一致、scope与文件实际语法作用域严格匹配、文件保存为.sublime-snippet后缀并置于packages/user/目录下;scope错误是“log+tab无反应”的最常见原因。

Sublime Text 的代码片段不会自动生效,必须同时满足三个硬性条件:tabTrigger拼写完全一致、scope与当前文件实际语法作用域严格匹配、文件保存为.sublime-snippet后缀并放在Packages/User/目录下。缺一不可,否则按 Tab 就是静默失败。
为什么 log + Tab 没反应?先查 scope 是否对得上
绝大多数“不生效”问题都出在 scope 字段。Sublime 不认你右下角显示的“JavaScript”,它只认内部作用域名,比如 source.js。Vue 单文件组件里的 <script></script> 块甚至不是 source.js,而是 source.vue meta.script.js。
- 打开目标文件,把光标放到想触发 snippet 的位置
- 按
Ctrl+Shift+P(Windows/Linux)或Cmd+Shift+P(macOS)→ 输入Developer: Show Scope Name回车 - 状态栏会立刻显示完整 scope 链,例如
source.js meta.block.js或source.tsx meta.jsx -
scope字段就填这个完整链,或取最左侧主干(如source.js),多个用逗号分隔:source.js, source.ts - 别写
javascript、js、vue——这些全无效
新建 snippet 必须用命令面板生成骨架,别手写 XML
手动写 .sublime-snippet 容易漏掉 或编码声明,导致解析失败。直接用内置命令最稳。
- 按
Ctrl+Shift+P→ 输入Tools: New Snippet回车,会生成带注释的模板 - 把你要插入的代码写进
<content></content>里,CDATA 能安全包裹、<code>&等符号 - 取消注释
<tabtrigger>log</tabtrigger>并填入纯字母/数字触发词(console.log不行,clg可以) - 取消注释
<scope>source.js</scope>并替换成你查到的实际 scope - 保存时文件名必须是
log.sublime-snippet(后缀错一个字符都不加载)
$1、${1:default} 和 $0 的行为差异很实在,别靠猜
它们不是视觉装饰,直接决定光标停在哪、能不能编辑、跳转是否同步。
-
$1是第一个跳转位;${1:console}表示默认填console,可删可改,按 Tab 后光标仍停在此处 - 重复用同一个编号(如两个
$1)会让它们变成同步字段:改一个,另一个跟着变 -
$0是最终出口,不是可选的——漏写会导致光标卡在最后一个$N,无法自然退出 - 想输出字面量
${date}?得写成\${date},否则 Sublime 会尝试解析变量(报错或跳过) - 占位符顺序按 XML 中首次出现位置算,不是按数字大小排;跳号(
$1、$3)会导致中间缺失跳转点
Vue / JSX / Markdown 代码块里 snippet 失效?scope 要写具体
这些环境不是纯 source.js,Sublime 会给嵌套内容打更细的作用域标签。写宽泛 scope(如 text.plain)可能引发冲突,写太窄又找不到入口。
- Vue
<script></script>块:用source.vue meta.script.js或至少source.vue - TSX 文件中的 JSX:用
source.tsx meta.jsx - Markdown 里的 Python 代码块:用
text.html.markdown meta.code-block.python - 不确定时,先用
Developer: Show Scope Name看光标所在位置的完整链,复制粘贴过去最保险 - 多 scope 写法:
<scope>source.js, source.vue meta.script.js, source.tsx meta.jsx</scope>
真正卡住人的从来不是语法多难,而是 scope 查得不准、文件放错路径、后缀少个字母——这三个地方错一个,snippet 就彻底隐身。每次新建前,花十秒查一次 scope,比重启五次 Sublime 有用得多。











