Visual Studio Code: Task 機能に複数の任意のコマンドを簡単に仕込む方法


概要

Visual Studio Code の Task に「複数の任意のコマンド」を仕込む簡単な方法を紹介する。

背景

Visual Studio Code の Task は1つの command に対して複数の arguments を与えて実行する仕様であり、コマンド自体を任意に実行したい一般的な用途には一見すると向かず引数に応じて処理を分岐するスクリプトを中間に仕込む必要があるかのように見える。

しかしながら、本稿で紹介する方法を用いれば Visual Studio Code の Task に事実上「任意のコマンド」をより簡単に定義して使用可能な事を確認したので紹介したい。

方法

例として sh を使用可能な一般的な環境について ls -la を実行する task la 等の仕込み方を提示する。例示する sh のほかこの手法は bashzsh または cmd.exepowershell.exe でも可能である。

.vscode/.task.json

{ "version": "0.1.0"
, "command": "sh"
, "isShellCommand": true
, "showOutput": "always"
, "args": [ "-c" ]
, "tasks":
  [ { "taskName": "la"
    , "suppressTaskName": true
    , "args": [ "ls -la" ]
    }
  , { "taskName": "hoge"
    , "suppressTaskName": true
    , "args": [ "echo hoge" ]
    }
  , { "taskName": "build"
    , "suppressTaskName": true
    , "args": [ "mkdir -k build; cd build; cmake ..; make" ]
    }
  , { "taskName": "debug"
    , "suppressTaskName": true
    , "args": [ "cd build; gdb bin/my-executable" ]
    }
  ]
}

解説

  • sh 等のシェルコマンドは任意のコマンドを実行するオプションを持っている。
    • sh, bash, zsh などの一般的なシェル: -c
    • cmd.exe: /C
    • powershell.exe: -Command
  • シェルコマンドへ渡すコマンドライン文字列は文字通りシェルコマンドの外からは文字列として渡すため"で囲み1つの文字列として渡している。 (†1)

(†1): 実験中に必要と判断して付けていたが、記事掲載後に @felixfbecker からの指摘 により vscode の task 機能では自動的にエスケープされるため不要と判明した。

利点

この方法を使うと Visual Studio Code の Task に複数の任意のコマンド実行タスクを簡単に仕込み易く便利が良い。

参考


付録

cmd の場合の具体的な tasks.json の例

任意のサブタスクをキーボードショートカットへ割り当てる方法

↑の cmd の例で @danielschmitz が以下の例を挙げてくれたのでついでに紹介。

{ "key": "ctrl+shift+alt+o", "command": "workbench.action.tasks.runTask/taskName" } 

これまで知らずに buildとtestを割り当てたタスク以外は、runTaskの割り当てを呼んでからタスク名を明示的に打ち込んで実行していました。これを知っていると器用さが向上して良いですね