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

时间:2019-10-25 22:14:17

标签: visual-studio-code code-snippets vscode-snippets

我想知道我是否可以在VSCode用户定义的代码段中引用另一个代码段。

说我有

"Test1": {
        "prefix": "snippet_test1",
        "body": 
            "something"
}

并且有一种方法可以在另一个代码段中插入snippet_test1

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

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

2 个答案:

答案 0 :(得分:1)

我认为在彼此之间包含或嵌套片段的唯一方法是使用宏或其他一些编程方式。这是使用宏扩展名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",命令,您将跳至下一个制表位$ 2,该位置可能在任何位置-我将它放在$ 1之前(其中已插入snippet1),并且snippet2将插入到制表位$ 2。 >

您可以看到Master Snippet是您构建用于插入其他摘要的结构的位置-根据制表符

宏看起来像这样(在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": "multiCommand.insertMultipleSnippets",
 },

您不能使用任何代码段前缀来触发整个宏,但是您仍然可以根据需要使用单独的代码段前缀来单独触发每个代码段。

使用上面的Master Snippetsnippet1snippet2,运行宏的结果将是:

body of master snippet
snippet2 = I am snippet2
body of snippet1
some other stuff
body of snippet1

您确实失去了一些功能,例如不能像占位符文本那样预先选择插入的代码段-如果像${1:howdy}这样使用,占位符文本howdy只会被插入的第一个代码段覆盖。

答案 1 :(得分:0)

@Mark为使用宏提供了一个很好的答案,对于感兴趣的人,我还有另一个可能的答案。

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

对于Test2,它仅显示Test1内容以外的snippet_test1,但是如果您在snippet_test1上点击ctrl+space,它将显示可用的代码段列表,并且您可以将snippet_test2中的文本扩展为snippet_test1中的全部内容。