VSCode 嵌套代码片段(或将一个代码片段包含在另一个代码片段中)。

11
我能否在VSCode用户自定义代码段中引用另一个代码段的片段?
假设我有:
"Test1": {
        "prefix": "snippet_test1",
        "body": 
            "something"
}

是否有一种方法可以将snippet_test1插入到另一个片段中,例如

"Test2": {
        "prefix": "snippet_test2",
        "body": 
            "${1:snippet_test1}"
}

现在 snippet_test2 只输出 snippet_test1,而不是 snippet_test1 的内容。


我不这么认为,但你可以轻松地用宏将代码片段链接在一起。 - Mark
1
你知道如何添加宏来完成这个任务吗? - Jin Yan
1
我已经在 VSC 存储库中打开了 https://github.com/microsoft/vscode/issues/101526,因为我有很多有用的代码片段,但由于没有将代码片段嵌入其他代码片段的方法,所以无法编写。如果这个问题得到 20 个赞,他们就会实现它。 - nichollsg
2个回答

5

@Mark提供了一种使用宏的好方法,我为那些感兴趣的人提供了另一个可能的答案。

"Test1": {
        "prefix": "snippet_test1",
        "body": 
            "something"
}
"Test2": {
        "prefix": "snippet_test2",
        "body": 
            "${1:snippet_test1}"
}

对于Test2来说,它只显示snippet_test1而非Test1的全部内容。但是,如果你在snippet_test1处按下ctrl+space,它将显示可能存在的snippet列表,你可以展开snippet_test2中的文本以查看snippet_test1的完整内容。


1
我喜欢你的想法,但是如果用户插入其他片段,它会破坏snippet_test2的流程,并且你无法移动到test2的下一个选项卡停止位置。我也不确定宏版本是否正常工作。 - Morteza Tourani

4

我认为唯一将片段包含或嵌套在彼此内的方法是使用宏或其他编程方式。 这里有一个使用宏扩展 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",    // or whichever keybinding you choose
  "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:你好}这样使用,占位符文本你好将被第一个插入的片段覆盖。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接