VS Code调试器扩展清单文件中如何在配置代码段中保留未展开的变量
我完全理解你遇到的困扰——在编写VS Code调试器扩展的configurationSnippets时,想把${command:debugger.getPaths}这个VS Code命令变量原封不动地保留在生成的配置里,结果却被错误解析成了debugger.debugger.getPaths,试了好几种转义方式都没效果,确实挺让人头疼的。
其实这个问题的核心是:VS Code的配置代码段引擎会自动解析${...}格式的代码段变量,把你写的${command:debugger.getPaths}当成了代码段内部的变量引用,而不是VS Code本身的命令变量。要让它保留原始的变量格式,你需要用代码段语法的转义规则来处理:
在configurationSnippets的body中,如果你想生成${command:debugger.getPaths}这个字符串,需要把$写成$$,也就是这样写:
"configurationSnippets": [ { "label": "Tester Debug Snippet (Launch)", "description": "Test config", "body": { "name": "Test Debug (Launch)", "type": "cppdbg", "request": "launch", "program": "$${command:debugger.getPaths}" } } ]
为什么这个方法有效?因为在VS Code的代码段语法里,$$会被解析成单个$,所以最终生成的launch.json里,program字段就会是你想要的${command:debugger.getPaths},而不是被错误展开的内容。
如果你之前试过这个写法但没生效,建议检查一下VS Code的版本(确保是较新的稳定版),或者确认扩展的package.json格式是否正确——比如有没有多余的逗号或者语法错误,这些都可能导致转义不生效。
另外,还有一种备选方案:如果上述方法还是不行,可以尝试在JSON字符串中用双重反斜杠转义$和{,也就是写成:
"program": "\\${command:debugger.getPaths}"
这种写法在JSON中会被解析为\${command:debugger.getPaths},而VS Code的代码段引擎会把\${解析为原始的${,同样能得到你想要的结果。
备注:内容来源于stack exchange,提问作者Haris

