$tm_selected_text仅在先选中文本再触发片段时生效,否则为空或被忽略;多光标下只取首选区内容;含换行符会保留导致格式错乱;需配合${1:default}设默认值,且变量行为受语言模式、时区等上下文严格约束。

为什么 $TM_SELECTED_TEXT 有时不生效
它只在你**先选中文本、再触发片段**时才起作用。如果只是光标停在某处输入 log,$TM_SELECTED_TEXT 会变成空字符串或被忽略——这不是 bug,是设计行为。
- 必须用鼠标或键盘(Shift+方向键)明确选中一段内容,再按 Tab 或 Enter 触发片段
- 选中内容含换行符时,
$TM_SELECTED_TEXT会保留换行,可能导致生成的代码格式错乱 - 在多光标编辑下,
$TM_SELECTED_TEXT只取第一个选区的内容,其余选区不参与替换
如何让变量带默认值或 fallback
${CURRENT_YEAR} 这类内置变量没有 fallback 机制,但你可以用 ${name:default} 语法给自定义占位符设默认值,比如 ${1:console} 或 ${2:debug}。
-
${1:msg}表示第一个跳转位置,默认填充msg,可直接编辑 -
${TM_FILENAME_BASE}比$TM_FILENAME更安全——它自动去掉扩展名,避免写成index.ts.ts - 不要写
${SELECTION}(旧写法),VSCode 已统一为$TM_SELECTED_TEXT,前者可能在新版本里静默失效
全局片段 vs 语言专属片段:变量行为一致吗
变量本身行为完全一致,但**生效前提不同**:全局片段在任何文件里都能触发,而语言专属片段(如 javascript.json)只在对应语言模式下激活——哪怕你把 JS 文件后缀改成 .txt,右下角语言模式没切回 JavaScript,片段也不会出现。
- 检查右下角语言标识是否正确(例如显示 “JavaScript” 而不是 “Plain Text”)
- 全局片段无法使用
$TM_LANGUAGE,因为它是上下文无关的;语言专属片段可以,值为当前语言 ID(如javascript、python) -
$BLOCK_COMMENT_START和$LINE_COMMENT在不同语言下自动适配,但在全局片段中可能 fallback 到空字符串
日期变量为什么总差一天或格式不对
$CURRENT_DATE 是零时区时间,而你的系统时区可能是东八区(UTC+8)。2026年7月22日 23:26 的 UTC 时间是 7月22日 15:26,所以 $CURRENT_DATE 显示的仍是 22 日——但如果你在凌晨 00:10 触发,它可能还卡在昨天。
- 优先用
$CURRENT_YEAR、$CURRENT_MONTH、$CURRENT_DATE分开拼接,比依赖$CURRENT_DATETIME(不存在)更可控 -
$CURRENT_MONTH固定输出两位数字(如07),不需要额外补零 - 别用
$TODAY——它不是 VSCode 内置变量,属于常见误传











