tabTrigger不生效主因是scope未匹配;须用Developer: Show Scope Name查真实作用域(如source.js),严格填入标签,文件放Packages/User/下且后缀为.sublime-snippet。

tabTrigger 不生效?先看 scope 对不对
最常见的情况是:你写好了 console.log($1);,设了 <tabtrigger>log</tabtrigger>,保存也成功了,但在 .js 文件里输 log + Tab 就没反应。根本原因几乎全是 scope 没配对。Sublime 不靠文件后缀判断语言,而是靠当前视图的语法 scope —— 比如你打开一个 .js 文件但右下角显示的是 Plain Text,那所有 source.js 的 snippet 都不会触发。
- 查当前 scope:按
Ctrl+Shift+P(Win/Linux)或Cmd+Shift+P(Mac),输入show_scope_name回车,状态栏会显示类似source.js meta.function.js的字符串 - 常见 scope 值必须严格匹配:
source.js(JS 文件)source.css(CSS 文件)text.html.basic(HTML 文件)text.html.vue(Vue 单文件组件) - 如果不想限定语言,可以删掉
<scope></scope>标签,但容易在错误上下文误触发(比如在注释里输for被展开)
content 里占位符跳不了?检查 CDATA 和变量写法
$1、$2 这类 tab stop 只有在 的顶层文本流中才可跳转。一旦被引号包裹、嵌套在属性值里,或者出现在注释中,Sublime 就当普通字符串处理。
- 错误写法:
<div class="$1">$2</div>→$1在双引号内,无法跳转 - 正确写法:
<div class="$1">$2</div>放在 CDATA 外层,且不被引号包围(实际应写为:$2]]>) - 多个占位符按数字顺序跳转,
$0是最终光标停留位置 - 别用
${1:default}这种写法——Sublime 不支持带默认值的占位符,只认$1、$2等纯数字形式
.sublime-snippet 文件放哪才生效?路径和命名必须严丝合缝
Sublime 只加载 Packages/User/ 目录下的 .sublime-snippet 文件,其他任何路径都不行。
- 获取正确路径:菜单
Preferences → Browse Packages…,直接进User/文件夹 - 文件名任意,但后缀必须是
.sublime-snippet(不是.snippet、.xml或.txt) - 编码必须为 UTF-8(无 BOM),否则中文或特殊字符可能解析失败
- 保存后无需重启,但若之前有同名 snippet 缓存,需手动删掉旧文件再试
tabTrigger 冲突了怎么办?别猜,直接搜
多个 snippet 设了相同的 <tabtrigger>log</tabtrigger>,Sublime 不报错,也不提示,而是静默采用「最后修改时间最晚」的那个文件。你改了 A,结果触发的还是 B 的内容,非常隐蔽。
- 排查方法:在
Packages/User/目录下用系统搜索或 VS Code 搜索全部含<tabtrigger>log</tabtrigger>的文件 - 看文件修改时间,删掉过期或重复的
- 临时重命名其他 snippet(比如加
_bak后缀),再测试是否恢复正常
真正容易被忽略的是 scope 的继承性 —— 比如 Vue 文件里 script 块的 scope 是 source.vue meta.script.js,只写 source.js 不够,得用 source.vue 或更精确的 source.vue meta.script.js 才能命中。

















