创建合法的 Sublime Text .sublime-snippet 文件需满足:文件为 XML 格式、以 .sublime-snippet 结尾、存于 Packages/User/ 对应路径下,且包含 根标签、(支持 $1 $0 等变量)、、 和 标签,大小写敏感、标签闭合。

如何创建一个合法的 Sublime Text .sublime-snippet 文件
Sublime Text 的代码片段必须是 XML 格式,且文件名以 .sublime-snippet 结尾,否则不会被识别。常见错误是直接保存为 .txt 或漏写 -snippet 后缀,导致重启后仍不生效。
新建文件后,按以下结构填写(注意大小写和标签闭合):
log source.js console.log() with placeholder
-
中的$1表示第一个光标停靠点,$0是最终光标位置 -
是触发补全的关键词,输入后按Tab即可展开 -
控制生效范围,比如source.js仅在 JS 文件中激活;可用text.html、source.python等,查 scope 推荐用Ctrl+Shift+P→Developer: Show Scope Name
为什么写完 snippet 却不出现补全?
最常被忽略的是文件存放路径和 scope 不匹配。Sublime 不会扫描任意目录,必须放在指定位置才能加载。
- Windows:
%APPDATA%\Sublime Text\Packages\User\ -
macOS:
~/Library/Application Support/Sublime Text/Packages/User/ - Linux:
~/.config/sublime-text/Packages/User/
确保文件名是 log.sublime-snippet(不是 log.snippet),且没有同名文件冲突。修改后无需重启,但若已打开同类型文件,需切换到其他 tab 再切回来,或手动执行 Ctrl+Shift+P → Reload Snippets。
tabTrigger 和 scope 怎么配合才不冲突
多个 snippet 可能共用同一个 tabTrigger,此时 scope 决定谁胜出。例如:
- 一个 snippet 的
+for source.python - 另一个同 trigger 的 snippet 设为
source.js
那么在 .py 文件里输 for + Tab,只会触发 Python 版本;在 .js 里则触发 JS 版本。但如果 scope 写成 text.plain,它会在所有文件生效,可能覆盖更具体的 snippet。
调试建议:临时把 改成 text.plain 测试是否加载成功,确认后再细化 scope。
进阶:动态插入当前文件名、日期或选中文本
Sublime 支持变量语法,但仅限于 区域内,且不能执行函数调用。
-
$TM_FILENAME→ 当前文件名(含扩展名) -
$TM_FILENAME_BASE→ 仅文件名(不含扩展名) -
$CURRENT_YEAR、$CURRENT_MONTH、$CURRENT_DATE→ 插入时间 -
$SELECTION→ 替换为当前选中的文本(适合包裹型 snippet,如加/** */注释)
示例:给选中文本加单引号
'$SELECTION' sq text.plain, source.js, source.python
注意:$SELECTION 在无选中时为空,不会报错;但若想“有选中才触发”,得靠 scope 或插件辅助,原生 snippet 不支持条件逻辑。
Sublime 的 snippet 看似简单,真正卡住人的往往不是语法,而是路径没放对、scope 拼错、或者 trigger 被其他插件劫持(比如 Emmet 会拦截 div、ul 等)。动手前先用 Developer: Show Scope Name 确认当前 context,比反复试错快得多。










