sublime代码片段生效需同时满足三个条件:文件后缀为.sublime-snippet、保存路径为packages/user/、xml根节点为;创建应通过tools→developer→new snippet…,内容置于cdata中,tabtrigger仅支持字母和下划线,scope必须与当前光标位置的实际作用域严格匹配,光标跳转用${1:default}语法实现。

Sublime 的代码片段不会自动生效,必须同时满足三个硬性条件:文件后缀是 .sublime-snippet、保存路径在 Packages/User/、XML 内容根节点为 <snippet></snippet>——缺一即静默失效,且不报错。
怎么创建一个能用的 .sublime-snippet 文件
别手动新建文本再改后缀,Windows 下极易因隐藏扩展名存成 log.sublime-snippet.txt;正确做法是直接从菜单触发:
- 点击 Tools → Developer → New Snippet…,它会生成带注释的 XML 框架
- 把占位内容填进
<content></content>,多行代码必须包在CDATA里,否则换行和符号会被 XML 解析器吞掉 -
<tabtrigger></tabtrigger>只能写纯字母或下划线,比如log可以,console.log不行(会被当作文本字面量) - 保存时务必选类型为
All Files,文件名填mylog.sublime-snippet,路径指向Packages/User/
为什么输入 tabTrigger 后按 Tab 没反应
最常见原因是 <scope></scope> 值和当前文件语法不匹配。Sublime 不提示、不报错,只是完全跳过你的 snippet。
- 先确认右下角显示的语法名(如
JavaScript),但注意:这不等于 scope —— Vue 文件中<script></script>块的实际 scope 是source.vue meta.script.js,不是source.js - 按
Ctrl+Shift+P(Win/Linux)或Cmd+Shift+P(Mac),输入Developer: Show Scope Name回车,状态栏会显示完整 scope 链,取最前面那段填进<scope></scope> - 没写
<scope></scope>或写错,snippet 就只在Plain Text模式下可用
如何让光标自动跳转和设默认值
靠 ${1:default} 这类语法实现,不是 $1 简单堆叠:
-
${1:console}表示第一个跳转位,展开后光标停在console上,可直接编辑;按 Tab 跳到${2:xxx} -
$0必须且只能出现一次,代表最终光标位置(比如函数末尾分号后) - 要复用同一值(如函数名两次出现),写成
${1:funcName}+${1},别重复写$1多次(它们会同步变化) - 所有变量(
$1、${1:xxx}、$tm_filename)必须处于CDATA的顶层文本流中,嵌套在 HTML 标签里会失效
真正容易被忽略的是 scope 的动态性:同一个文件不同区域作用域可能完全不同,比如 Markdown 中的 Python 代码块 scope 是 text.html.markdown meta.code-block.python,而纯 .py 文件是 source.python。写 snippet 前,务必用 Show Scope Name 实时验证光标所在位置的实际 scope。











