我认为唯一将片段包含或嵌套在彼此内的方法是使用宏或其他编程方式。 这里有一个使用宏扩展 multi-command
的解决方案。
假设你有这三个片段(在某个片段文件中):
"Master Snippet": {
"prefix": "master_snippet",
"body": [
"body of master",
"snippet2 = $2",
"$1",
"some other stuff",
"$1",
],
"description": "build the multi-snippet"
},
"snippet1": {
"prefix": "sn1",
"body": [
"body of snippet1",
],
"description": "insert1"
},
"snippet2": {
"prefix": "sn2",
"body": [
"I am snippet2",
],
"description": "insert2"
},
然后您的宏将首先打印“Master Snippet”,然后无论光标位于哪里 - 光标最初将在$1标签位置 - 宏将插入snippet1。
然后,使用宏中的“jumpToNextSnippetPlaceholder”命令,您将跳转到下一个tabstop $2,该tabstop可能位于任何位置 - 我将其放在$1之前(snippet1被插入的位置),并且snippet2将插入在tabstop $2处。
您可以看到,“Master Snippet”是您“构建结构”的地方,用于插入其他片段-“根据tabstops”。
此宏在您的settings.json中如下:
"multiCommand.commands": [
{
"command": "multiCommand.insertMultipleSnippets",
"sequence": [
{
"command": "editor.action.insertSnippet",
"args": {
"name": "Master Snippet",
}
},
{
"command": "editor.action.insertSnippet",
"args": {
"name": "snippet1",
}
},
"jumpToNextSnippetPlaceholder",
{
"command": "editor.action.insertSnippet",
"args": {
"name": "snippet2",
}
},
]
}
],
然后通过一些键绑定(keybindings.json)来触发宏:
{
"key": "alt+m",
"command": "extension.multiCommand.execute",
"args": { "command": "multiCommand.insertMultipleSnippets" },
"when": "editorTextFocus"
},
整个宏不能使用任何片段前缀来触发,但如果您愿意,仍然可以使用各自的片段前缀单独触发每个片段。
使用上述的主要片段
、片段1
和片段2
,运行宏的结果将如下:
body of master snippet
snippet2 = I am snippet2
body of snippet1
some other stuff
body of snippet1
您会失去一些功能,例如插入的片段不能像占位符文本那样预选 - 如果像${1:你好}
这样使用,占位符文本你好
将被第一个插入的片段覆盖。