Выбор фрагмента кода Visual Studio и переменные

Я пишу свой собственный фрагмент в console.log

{  
  "Print to console": {
    "scope": "javascript,typescript",
    "prefix": "debug",
    "body": [
      "console.log('${1|[Debug],[Server],[$TM_FILENAME]|}','${2:~Line: $TM_LINE_NUMBER ~ File:$TM_FILENAME}',${3:$TM_SELECTED_TEXT}); //debug",
      "$4"
    ],
    "description": "Log output to console"
  }
}

Все в порядке, за исключением того, что вместо имени файла отображается статический текст TM_FILENAME в вариантах выбора для заполнителя '$1' ${1|[Debug],[Server],[$TM_FILENAME]|}. Как я могу сделать так, чтобы имя файла отображалось здесь? Спасибо за предложения


person alwaysLearn    schedule 26.02.2021    source источник
comment
Похоже, ваш выбор не поддерживает переменные. Насколько предполагает приведенная грамматика, выбор может быть только текстовым.   -  person Josef Wittmann    schedule 26.02.2021
comment
См. github.com/microsoft/vscode/issues/87949 В вариантах фрагментов нет переменных.   -  person Mark    schedule 27.02.2021


Ответы (1)


Хотя вы не можете напрямую использовать переменные в выборе фрагмента, вы можете обойти это следующим образом:

  "Print to console": {
    "scope": "javascript,typescript",
    "prefix": "debug",
    "body": [

      // moved brackets in the choice
      "console.log('[${1|Debug,Server],fileName|}]','${2:~Line: $TM_LINE_NUMBER ~ File:$TM_FILENAME}',${3:$TM_SELECTED_TEXT}); //debug",
      "$4"
    ],
    "description": "Log output to console"
  },

  "getfileName": {
    "scope": "javascript,typescript",
    "prefix": "fileName",   // <= same exact prefix as appears in the choice above
    "body": [
      "$TM_FILENAME"
    ],
    "description": "get the file name"
  }

Идея состоит в том, что выбор fileName на самом деле является еще одним фрагментом, который вы можете активировать после выбора. После выбора fileName вам нужно будет нажать Ctrl+Пробел, чтобы открыть второй фрагмент. Это немного больше работы, но позволяет вам получить переменное поведение при выборе фрагмента. А во втором фрагменте вы можете добавить или изменить имя файла по своему усмотрению.

Кроме того, иногда вам нужно немного изменить выбор. Я изменил ваш, но результат тот же. В противном случае печатается [fileName], и это не будет рассматриваться как совпадение с другим префиксом fileName. Хотя в вашем случае вы можете оставить это как:

"console.log('${1|[Debug],[Server],[fileName]|}','${2:~Line: $TM_LINE_NUMBER ~ File:$TM_FILENAME}',${3:$TM_SELECTED_TEXT}); //debug",

в первом фрагменте, а затем сделайте второй префикс следующим образом:

"prefix": "fileName]",  // note the trailing bracket

Тот же результат, просто не забудьте настроить второй префикс, чтобы он соответствовал тому, что на самом деле выводится при выборе выбора, иначе он не будет работать.

переменная выбора сниппета

person Mark    schedule 26.02.2021