${1:default} 不生效因默认值被跳转干扰或XML解析失败,而$1仅设光标位置更稳定;内置变量如${TM_FILENAME}、${SELECTION}可实现上下文感知插入,正则替换受限于Sublime引擎能力,$0必须唯一且正确放置否则跳转中断。

为什么 `${1:default}` 有时不生效,而 `$1` 反而更可靠
根本原因在于 Sublime 对默认值的解析逻辑:当 `
实操建议:
- 仅在明确需要用户首次编辑时看到提示文字时才用 `${1:default}`,例如 ``
- 函数参数、变量名等需自由输入的场景,优先用 `$1`、`${2}`,避免默认值干扰跳转节奏
- `${1:default}` 中的 default 不支持换行或未闭合引号,否则 XML 解析失败,整个 snippet 静默失效
如何用 `${TM_FILENAME}` 和 `${SELECTION}` 实现上下文感知插入
这些内置变量不是装饰,而是真正能读取编辑器状态的钩子。`${TM_FILENAME}` 返回当前文件名(不含路径),`${SELECTION}` 插入你已选中的文本——它们让 snippet 从“静态模板”变成“动态响应体”。
典型用法:
- 生成与文件同名的 React 组件:
{ return <div>$1</div>; };]]>(配合正则提取文件名) - 包裹选中文本加注释:
,选中foo()后触发,得到/* foo() */ - `${SELECTION}` 在空选区时为空字符串,不会报错,但若依赖它做逻辑分支(如条件判断),需额外用 `${SELECTION/(?=.+)/true:false}` 处理
正则替换 `${var/(pattern)/(format)/}` 的实际边界
这个语法看似强大,但 Sublime 的正则引擎不支持捕获组重用(如 在 format 中无效)、不支持 lookbehind,且 pattern 必须完全匹配整个变量值——不是部分匹配。
常见踩坑点:
- 想把
user_id转成userId?不能写${1/(.+)_(.+)/$1$2/},因为$1在 format 里不被识别;得用${1/_(.)/\U$1/g}配合全局标志 - pattern 中的括号必须成对,且不能嵌套;
${TM_FILENAME/(.*?)(\.[^.]*)?/$1/}是安全的,但${TM_FILENAME/(.*?)(\.[^.]*?)?/$1/}因问号嵌套可能崩溃 - format 部分不支持 `\n` 换行,只认字面 `\n` 字符;要插换行,得在 CDATA 里直接写
\n
多级跳转 `$1 → $2 → $0` 为何卡在 `$2` 就停了
这不是 bug,是 `$0` 被遗漏或位置错误导致的必然结果。`$0` 是最终停留点,Sublime 要求它**必须出现且只能出现一次**,且不能被包裹在条件表达式或嵌套占位符中。
排查重点:
- 检查是否误写成 `${0}` 或 `$00` —— 只有 `$0` 有效
- 确认 `$0` 在 `
` 内,且未被注释或 CDATA 闭合标签截断 - 如果用了条件语法如 `${1:(?foo:bar)}`,确保 `$0` 不在括号内,否则跳转链中断
- 最隐蔽的问题:XML 缩进污染。如果 `$0` 所在行前面有空格或 Tab,Sublime 会把它当作文本内容而非占位符,跳转失效
复杂模板里,`$0` 的位置往往比想象中更关键——它不单是终点,更是 Sublime 判断跳转是否完成的唯一锚点。漏掉它,就等于没交卷。


















