概要
Visual Studio Code の Task に「複数の任意のコマンド」を仕込む簡単な方法を紹介する。
背景
Visual Studio Code の Task は1つの command に対して複数の arguments を与えて実行する仕様であり、コマンド自体を任意に実行したい一般的な用途には一見すると向かず引数に応じて処理を分岐するスクリプトを中間に仕込む必要があるかのように見える。
しかしながら、本稿で紹介する方法を用いれば Visual Studio Code の Task に事実上「任意のコマンド」をより簡単に定義して使用可能な事を確認したので紹介したい。
方法
例として sh
を使用可能な一般的な環境について ls -la
を実行する task la
等の仕込み方を提示する。例示する sh
のほかこの手法は bash
や zsh
または cmd.exe
や powershell.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 に複数の任意のコマンド実行タスクを簡単に仕込み易く便利が良い。
参考
- Visual Studio Code
- @IT : Visual Studio Codeの使い勝手をよくするツール
- 各種シェルコマンドのヘルプ
sh --help
cmd.exe /?
powershell.exe /?
-
github : Microsoft/vscode > Issues > #981 Cannot define multiple commands in tasks.js
- Qiita へのポストからしばらく後に本家 Issues でも類似の要求を発見、本手法を紹介しつつ、その後クロスプラットフォーム対応やクォート不要のフォローアップを頂くなどのやり取りがあった。
付録
cmd
の場合の具体的な tasks.json
の例
任意のサブタスクをキーボードショートカットへ割り当てる方法
↑の cmd
の例で @danielschmitz が以下の例を挙げてくれたのでついでに紹介。
{ "key": "ctrl+shift+alt+o", "command": "workbench.action.tasks.runTask/taskName" }
これまで知らずに buildとtestを割り当てたタスク以外は、runTask
の割り当てを呼んでからタスク名を明示的に打ち込んで実行していました。これを知っていると器用さが向上して良いですね