Подтвердить что ты не робот

Несколько команд/задач с кодом Visual Studio

У меня есть локальная папка, которую я использую как блокнот для нескольких кусочков кода и игрушек. Я храню в этом каталоге множество сценариев python, С++, shell и т.д.

Я использую Visual Studio Code (на OS X), и я смотрю свои задачи для запуска/компиляции фрагментов кода без необходимости переключитесь на терминал.

Например, я нашел эта следующая задача будет запускать python в текущем открытом файле.

// A task runner that runs a python program
{
    "version": "0.1.0",
    "command": "/usr/bin/python",
    "args": ["${file}"]
}

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

Как реализовать задачу для запуска команды на основе типа файла (или выбрать между несколькими командами)? То есть если я редактирую файл С++, он будет запускать clang++.

  • Если я не могу сделать это на основе типа файла; есть ли альтернативы этому?
  • Альтернативой будет; поддерживаются ли несколько команд?
4b9b3361

Ответ 1

Вы всегда можете использовать bash как свою задачу, а затем назначать произвольные команды терминалов в качестве своих задач.

{
    "version": "0.1.0",
    "command": "bash",
    "isShellCommand": true,
    "showOutput": "always",
    "args": [
        "-c"
    ],
    "tasks": [
        {
            "taskName": "My First Command",
            "suppressTaskName": true,
            "isBuildCommand": true,
            "args": ["echo cmd1"]
        },
        {
            "taskName": "My Command Requiring .bash_profile",
            "suppressTaskName": true,
            "args": ["source ~/.bash_profile && echo cmd2"]
        },
        {
            "taskName": "My Python task",
            "suppressTaskName": true,
            "args": ["/usr/bin/python ${file}"]
        }
    ]
}

Несколько заметок о том, что здесь происходит:

  • Используя bash -c для всех задач, поместив его в args список команды, чтобы мы могли запускать произвольные команды. Операторы echo являются просто примерами, но могут быть любыми исполняемыми с вашего терминала bash.
  • Массив args будет содержать одну строку, которая будет передана в bash -c (отдельные элементы будут обрабатываться как несколько аргументов команды bash, а не команда, связанная с аргументом -c).
  • suppressTaskName используется, чтобы сохранить taskName из состава
  • Вторая команда показывает, как вы можете загрузить свой ~/.bash_profile, если вам нужно что-либо, что он предоставляет, например, псевдонимы, переменные env, любые
  • Третья команда показывает, как вы могли использовать команду Python, о которой вы говорили

Это не даст вам какого-либо обнаружения расширений файлов, но вы можете хотя бы использовать cmd + p, а затем введите "task", чтобы получить список своих задач. Вы всегда можете пометить свои 2 наиболее распространенные команды с помощью isBuildCommand и isTestCommand, чтобы запустить их через cmd + shift + b или cmd + shift + t соответственно.

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

Ответ 2

Этот ответ изначально был нацелен на более сложное решение, но более полезный был формат простой командной строки оболочки, представленный в принятом ответе. Ниже показано, как это выглядит.


Ограничение здесь заключается в том, что код VS ограничен одной задачей/командой построения высокого уровня для заданного рабочего пространства. Разрешено несколько подзадач, но они ограничены использованием команды верхнего уровня, но могут предоставлять разные "аргументы". Это было бы хорошо подходит для среды, которая использует систему сборки, похожую на make, ant или msbuild. Например;.

{
    "version": "0.1.0",
    "command": "make", // command must appear here
    "tasks" : [
        {
            "taskName": "clean",
            "suppressTaskName": false, // false by default
            //"command": "somethingelse", // not valid here
            "args": ["${file}"] // if required
        },
        {
            "taskName": "install"
            // ...
        }
    ]
}

Доступны две альтернативы:

  • Попросите пользовательскую script попытку выполнить компиляцию/выполнение только с учетом аргументов в task.json.

    -- the shell file would be a simple
    "[email protected]" # run what I get
    -- the tasks.json
    "args": ["clang++", "-std=c++14", "-O2", "${file}"]
    

    Получение exectuable для запуска (./a.out) было большим усилием. Просто добавив его, поскольку аргумент не работал, оболочка script должна была выполнить ее, если она была там.

  • Отключите переключение и выполнение вывода в пользовательский script, учитывая расширение файла и имя файла. Это оказалось проще реализовать и предложило больше контроля в оболочке script.

    {
        "version": "0.1.0",
        "isShellCommand": true,
        "taskName": "generic build",
        "showOutput": "always",
        "args": ["${fileExtname}", "${file}"]
        "command": "./.vscode/compileme.sh", // expected in the "local settings" folder
        //"command": "~/compileme.sh", // if in HOME folder
    }
    

    И оболочка script, compileme.sh;

    #!/bin/sh
    # basic error checking not shown...
    echo "compilation being executed with the arguments;"
    echo "[email protected]"
    filetype=$1
    file=$2
    if [ $filetype = ".cpp" -o $filetype = ".cxx" ] ; then 
        clang++ -std=c++14 -Wall -Wextra -pedantic -pthread $file && ./a.out
    elif [ $filetype = ".c" ]
        then 
        clang -std=c11 -Wall -Wextra -pedantic -pthread $file && ./a.out
    elif [ $filetype = ".sh" ]
        then
        $file
    elif [ $filetype = ".py" ]
        then
        python $file
    else
        echo "file type not supported..."
        exit 1
    fi
    

Учитывая параметры, перечисленные выше, предпочтительнее второй вариант. Эта реализация работает на OS X, но ее можно легко портировать в Linux и Windows по мере необходимости. Я буду следить за этим и попытаться отслеживать изменения в задачах сборки VS-кода, сборки на основе файлов или поддержка нескольких команд могут быть приятным дополнением.


Мои задачи .json поддерживает несколько бегунов и по умолчанию для сборки, которая печатает сообщение как напоминание. Он использует оболочку как бегун и теперь выглядит как...

{
    "version": "0.1.0",
    "isShellCommand": true,
    "taskName": "GenericBuild",
    "showOutput": "always",
    "command": "sh",
    "suppressTaskName": false,
    "args": ["-c"],
    "tasks": [
        {
            "taskName": "no build",
            "suppressTaskName": true,
            "isBuildCommand": true,
            "args": [
                "echo There is no default build task, run a task by name..."
            ]
        },
        {
            "taskName": "cpp",
            "suppressTaskName": true,
            "args": [
                "clang++ -std=c++14 -Wall -Wextra -pedantic -pthread \"${file}\" && ./a.out"
            ]
        },
        {
            "taskName": "shell",
            "suppressTaskName": true,
            "args": [
                "\"${file}\""
            ]
        },
        {
            "taskName": "python",
            "suppressTaskName": true,
            "args": [
                "python \"${file}\""
            ]
        },
        {
            "taskName": "c",
            "suppressTaskName": true,
            "args": [
                "clang -std=c11 -Wall -Wextra -pedantic -pthread \"${file}\" && ./a.out"
            ]
        }
    ]
}

Ответ 3

Вы можете написать и запустить собственный файл сценария вместо python и т.д. Напрямую. В файле сценария вы извлекаете расширение файла, чтобы вызывать python, clang или любой другой необходимый компилятор/переводчик.

Таким образом, ваш файл задач будет выглядеть так;

// A task runner that runs a program
{
   "version": "0.1.0",
   "command": "${workspaceRoot}\\runProgram.sh"
   "args": ["${file}"]
}

Ответ 4

Я сделал этот сценарий.

Это требует, чтобы вы установили Python IDLE в вашей среде. Это откроет IDLE и будет запускать ваш файл python при каждом запуске задачи (CTRL + Shift + B).

{
    "version": "0.1.0",             
    "command": "/usr/bin/idle",
    "isShellCommand": false,
    "showOutput": "never",
    "args": ["-r","${file}"]    
}