我认为在彼此之间包含或嵌套 sn-ps 的唯一方法是使用宏或其他一些编程方式。这是使用宏扩展 multi-command 的解决方案。
假设你有这三个 sn-ps(在一些 sn-ps 文件中):
"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 制表位位置 - 宏将插入 sn-p1。
然后使用宏中的"jumpToNextSnippetPlaceholder", 命令,您将跳转到下一个tabstop $2,它可以在任何地方——我把它放在$1 之前(sn-p1 被插入的地方),sn-p2 将被插入到tabstop $2。
您可以看到Master Snippet 是您构建结构以插入其他 sn-ps - 根据制表位。
宏看起来像这样(在您的 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", // or whichever keybinding you choose
"command": "extension.multiCommand.execute",
"args": { "command": "multiCommand.insertMultipleSnippets" },
"when": "editorTextFocus"
},
您不能使用任何 sn-p 前缀来触发整个宏,但如果您愿意,您仍然可以使用单个 sn-p 前缀来单独触发每个 sn-p。
使用上述Master Snippet、snippet1 和snippet2,运行宏的结果将是:
body of master snippet
snippet2 = I am snippet2
body of snippet1
some other stuff
body of snippet1
你确实失去了一些功能,比如插入的 sn-p 不能像占位符文本那样被预先选择 - 如果像 ${1:howdy} 那样使用,占位符文本 howdy 只会被插入的第一个 sn-p 覆盖。