vs code代码片段仅支持官方内置变量,需严格遵循大小写和语法规范;body必须为字符串数组,变量如$current_year需全大写,${1:default}用于默认值和光标停靠,$selection替代已弃用的$tm_selected_text。

VSCode代码片段里哪些变量能用、怎么写才生效
不是所有以$开头的写法都能被识别为变量,只有 VS Code 官方支持的内置变量才在 body 中解析;手写错格式(比如漏大括号、大小写错误)会导致原样输出成字符串。
-
$TM_FILENAME、$CURRENT_YEAR、$SELECTION这类无默认值的变量,直接写$VAR_NAME即可 - 需要默认值或光标停靠点时,必须用
${1:default}语法:${2:props}表示第二个 tabstop,默认填props;$0是最终光标退出位置 -
$TM_SELECTED_TEXT已被弃用,正确写法是$SELECTION(注意大小写),且仅在用户有选中文本时才替换 - 语言相关变量如
$TM_LANGUAGE返回的是javascript这类 ID,不是文件后缀,别和$TM_FILENAME_BASE混用
为什么模板里用了变量却没被替换
最常见原因是 JSON 文件编码或语法错误:多了一个逗号、少了一个引号、或者把 body 写成了字符串而非字符串数组——VS Code 不报错,但变量完全不解析,只会原样插入。
- 检查
body是否为数组:"body": ["console.log('$SELECTION');"]✅,不是"body": "console.log('$SELECTION');"❌ - 确保整个 JSON 合法:用 VS Code 自带的 JSON 验证(底部状态栏会提示“Problems”)
- 变量名大小写敏感:
$current_year不生效,必须是$CURRENT_YEAR - 在全局片段中使用
$TM_FILENAME时,如果当前没打开文件(比如新建 Untitled-1),它会为空字符串,不是报错
插件开发中动态注入变量要绕开哪些坑
如果你写的是 VS Code 插件(不是纯 snippet 配置),想在运行时生成带变量的模板,vscode.SnippetString 是唯一可靠路径;直接拼接字符串 + editor.insertText() 会让所有 $ 变量失效。
- 必须用
new vscode.SnippetString(template)包裹模板,再传给editor.insertSnippet() -
SnippetString支持${1:default}和$SELECTION,但不支持$CURRENT_DATE这类运行时计算变量——它们只在静态 snippet 中由编辑器解析 - 想插入当前日期?得自己用
new Date().toISOString().split('T')[0]拼进去,不能依赖 snippet 变量 - 多行模板中换行符必须用
\n,别用数组join('\n')后再塞进SnippetString,否则缩进错乱
自定义变量(比如项目名、作者)怎么安全加进去
VS Code 原生不支持用户自定义变量,但可以用配置项 + 插件桥接,或者退而求其次,在 snippet 中留占位符让人工填。
- 推荐做法:用
${1:YourName}或${2:project-name},触发后手动改,比硬编码更可控 - 真要自动填,得写插件读取
vscode.workspace.getConfiguration().get('myExtension.author'),再构造SnippetString - 别试图用
process.env注入系统环境变量到 snippet——VS Code 的 snippet 引擎根本不访问 Node.js 运行时环境 - 全局配置变量(如 author)建议放在
settings.json里,而不是插件里,方便团队统一维护
body 是数组、变量全大写、没语法错误,95% 的问题就消失了。











