7

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

说我有

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

有没有办法在另一个片段中插入片段测试1

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

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

4

2 回答 2

4

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

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

对于 Test2,它只显示除 Test1 内容之外ctrl+space的 snippet_test1,但如果您点击 snippet_test1,它将显示一个可用的片段列表,您可以将 snippet_test2 中的文本扩展为 snippet_test1 中的完整内容。

于 2019-10-28T17:30:19.200 回答
3

我认为在彼此中包含或嵌套片段的唯一方法是使用宏或其他一些编程方式。这是使用宏扩展的解决方案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 制表位位置 - 宏将插入片段 1。

然后使用"jumpToNextSnippetPlaceholder",宏中的命令,您将跳转到下一个 tabstop $2,它可能在任何地方——我把它放在 $1 之前(插入了 snippet1),并且 snippet2 将插入到 tabstop $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": "extension.multiCommand.execute",
  "args": { "command": "multiCommand.insertMultipleSnippets" },
  "when": "editorTextFocus" 
},

您不能使用任何片段前缀来触发整个宏,但如果您愿意,您仍然可以使用单个片段前缀来单独触发每个片段。

有了上面Master Snippet,运行宏snippet1snippet2结果将是:

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

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

于 2019-10-27T02:47:12.177 回答