Можно ли создать задачу на основе конкретного расширения файла?

#c #c #visual-studio-code #vscode-tasks

Вопрос:

В частности, я хотел бы, чтобы одно сочетание клавиш создавало исполняемый файл с правильной командой компиляции и флагами, независимо от того, является ли исходный файл a .c или a .cpp .

Например, мой текущий файл задач, который компилирует .cpp файлы, выглядит следующим образом:

 {
    "version": "2.0.0",
    "tasks": [
        {
            "type": "cppbuild",
            "label": "C/C  : g  -9 build active file",
            "command": "/usr/bin/g  ",
            "args": [
                "-g",
                "${file}",
                "-o",
                "${fileDirname}/${fileBasenameNoExtension}"
            ],
            "options": {
                "cwd": "${workspaceFolder}"
            },
            "problemMatcher": [
                "$gcc"
            ],
            "group": {
                "kind": "build",
                "isDefault": true
            },
            "detail": "Task generated by Debugger."
        }
    ]
}
 

Я заметил , что если я изменюсь "commands" на "/usr/bin/gcc" , он сможет компилировать файлы .c.

Итак, что я хочу, чтобы мой файл задач выполнял:

  1. Извлеките расширение ( .c или .cpp ) файла, на основе которого я создаю.
  2. Установите переменную, которой будет присвоено значение "command" .
  3. Условно измените эту переменную на "/usr/bin/gcc" или "/usr/bin/g " на основе извлеченного расширения.

Возможно ли все это? У вас есть лучшее предложение для достижения такого рода условного построения?

Спасибо!

Комментарии:

1. Вы можете добавить a languageid==cpp в предложение where привязки ключей и запустить именованную задачу в качестве привязанной команды

Ответ №1:

Вы можете использовать переменную команды расширения.

Используйте команду: extension.commandvariable.file.fileAsKey

Порядок расширений важен.

 {
    "version": "2.0.0",
    "tasks": [
        {
            "type": "cppbuild",
            "label": "C/C  : g   build active file",
            "command": "${input:pickCompiler}",
            "args": [
                "-g",
                "${file}",
                "-o",
                "${fileDirname}/${fileBasenameNoExtension}"
            ],
             ...
             ...
        }
    ],
    "inputs": [
      {
        "id": "pickCompiler",
        "type": "command",
        "command": "extension.commandvariable.file.fileAsKey",
        "args": {
          ".cpp": "/usr/bin/g  ",
          ".c": "/usr/bin/gcc"
        }
      }
    ]
}
 

Комментарии:

1. Спасибо! Кажется, это несколько приблизило меня (после изменения pickCompiler на PickCompiler), но теперь я получаю расширение «command». файл с переменными командами. Файловый ключ «не найден» сообщение при попытке сборки.

2. @Benjamin Вы прочитали первую строку ответа? Я исправлю опечатку

3. О, ты прав! Я новичок во всем этом. После установки расширения я теперь получаю следующую ошибку компиляции: «${input:PickCompiler} -g /..path../name.cpp -o /..путь../имя /bin/sh: 1: Плохая замена». Я получаю это как для .c, так и для .cpp

4. @Benjamin Каков ваш текущий tasks.json контент, отредактируйте свой вопрос