tab键不触发snippet,根本原因是tabtrigger、scope或文件位置三者至少一个错误:文件须放packages/user/下且后缀为.sublime-snippet,tabtrigger须合法唯一,scope须匹配真实语法作用域(如source.js)。

Tab 键不触发 Snippet,基本就是 tabTrigger、scope、文件位置三者中至少一个没对上——不是 Sublime 坏了,是它根本没“看见”你的片段。
Snippet 文件必须放在 Packages/User/ 目录下才生效
Sublime 只扫描两个地方的 .sublime-snippet 文件:插件自带目录(比如 Emmet)和用户自定义目录 Packages/User/。其他任何路径——桌面、项目根目录、Packages/MyStuff/ 子目录,哪怕文件名和内容完全正确,也静默忽略。
- 用菜单
Preferences → Browse Packages…打开目录,再进User/文件夹,这是唯一可靠路径 - Windows 路径是
%APPDATA%\Sublime Text\Packages\User\,macOS 是~/Library/Application Support/Sublime Text/Packages/User/,Linux 是~/.config/sublime-text/Packages/User/ - 新创建的文件要等 Sublime 下次启动才识别(改已有文件则保存即生效)
- 文件名不能含中文、空格或特殊符号,后缀必须严格为
.sublime-snippet(.snippet或.sublime-snippet.xml都无效)
tabTrigger 必须唯一、合法且大小写敏感
触发词不是“输入什么就匹配什么”,而是精确匹配 <tabtrigger>xxx</tabtrigger> 中的纯文本。一旦写错,Tab 就像按在空气里。
- 只允许英文、数字、短横线(
-),禁止点号(.)、斜杠(/)、空格、下划线(_)——console.log不行,log或clog可以 - 区分大小写:
Log和log是两个不同触发词 - 多个 snippet 用了相同
tabTrigger,只有按文件名 ASCII 排序最后加载的那个生效(比如z-log.sublime-snippet会覆盖a-log.sublime-snippet) - 输入后按 Tab 没反应?先打开控制台(
Ctrl+`),看有没有error loading snippet类报错
scope 写错 = 片段彻底隐身
Scope 不是你在右下角看到的“JavaScript”这种友好名称,而是 Sublime 内部语法作用域字符串。写错一个字母,哪怕文件位置、tabTrigger 全对,它也不会出现在当前文件里。
- 查当前光标处真实 scope:按
Ctrl+Shift+P→ 输入Developer: Show Scope Name,状态栏会显示类似source.js或source.ts.react的值 - 常见合法 scope:
source.js、source.python、text.html.basic、source.css;javascript、js、html这类简写全无效 - 支持多 scope 用逗号分隔:
source.js, source.ts, source.jsx,但不能有空格 - Vue 单文件组件的
<script></script>块要用source.js.embedded.html,不是source.js
$1、$2、$0 占位符不连续或漏 $0 会导致光标失控
占位符不是可选功能,而是编辑流程控制开关。错一处,补全后可能光标直接跳到文件末尾,或者无法继续 Tab 切换。
-
$1必须存在,且编号需从 1 开始连续($1、$2、$3),不能跳号或倒序 -
$0必须有且只能有一个,代表最终退出 snippet 编辑态的位置;漏掉它,按多次 Tab 后光标会消失在片段外 - 想插入实际美元符号,得写成
\$,否则会被解析为占位符 -
${1:default}可设默认值,${SELECTION}能包裹当前选中内容,但这些变量依赖正确 scope 和触发环境才能展开
最常被忽略的其实是 scope 查验环节——很多人凭经验写 source.js,却没意识到当前文件实际是 source.js.jsx 或 source.ts,结果反复检查路径和 trigger,就是想不到去看一眼状态栏。











