Вложенные фрагменты VSCode (или включают фрагмент внутри другого фрагмента) - PullRequest
1 голос
/ 26 октября 2019

Мне интересно, могу ли я сослаться на другой фрагмент внутри фрагмента в пользовательском фрагменте VSCode.

Скажем, у меня есть

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

, и есть ли способ вставить snippet_test1 вдругой фрагмент, например

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

Теперь snippet_test2 просто выводит snippet_test1 вместо содержимого snippet_test1.

Ответы [ 2 ]

1 голос
/ 27 октября 2019

Я думаю, что единственный способ включать или вкладывать фрагменты друг в друга - это использовать макрос или какой-либо другой программный способ. Вот решение, использующее расширение макроса 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"
},

Тогда ваш макрос напечатает *Сначала 1008 *, а затем, где бы ни находился курсор - курсор будет изначально находиться в обеих позициях табуляции $ 1 - макрос вставит фрагмент 1.

Затем с помощью команды "jumpToNextSnippetPlaceholder", в макросе вы перейдете к следующемуtabstop $ 2, который может быть где угодно - я положил его до $ 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": "multiCommand.insertMultipleSnippets",
 },

Вы не можете использовать любой префикс фрагмента для запуска всего макроса, но вы все равно можете использовать отдельные префиксы фрагмента для запуска каждого снипиppet индивидуально, если хотите.

С вышеприведенными Master Snippet, snippet1 и snippet2 результат запуска макроса будет:

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

Вы потеряете некоторую функциональность,как вставленный фрагмент не может быть предварительно выбран, как текст заполнителя - если используется как ${1:howdy}, текст заполнителя howdy просто перезаписывается первым вставленным фрагментом.

0 голосов
/ 28 октября 2019

@ Марк дает хороший ответ на использование макросов, и я получил другой возможный ответ для тех, кто заинтересован.

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

Для Test2 он показывает только snippet_test1, отличный от содержимого Test1, но если вы нажмете ctrl+space на snippet_test1, он покажет список возможных доступных фрагментов, и вы можете расширить текст в snippet_test2 до полного содержимого в snippet_test1.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...