概要
Visual Studio Code の Task へ Visual Studio Code: Task 機能に複数の任意のコマンドを簡単に仕込む方法 を数日前に整理した。次の Task への機能要求として、「音によるタスクの通知機能」が欲しい。
例によって vscode の task へ通知音を仕込む方法を強引に実現したので紹介したい。
背景
私は Visual Studio Code でも専ら C++ を扱っている。すると翻訳やリンクなどのビルドタスクの実行には多少の時間がかかる事が多い。また、昨今のビルドタスクは一般に CMake で管理する事が事実上のスタンダードの1つとして広く定着しつつあり、 ExternalProject など使っている場合にはその取得時間などもかかる。
そこで、従来他の環境ではタスク完了時に何らかの方法で音を鳴らして通知する事で、タスク中にも他の作業を行いつつ、タスク完了時には確実にすぐに元の作業へ戻れるようにしている。vscode の task 機能でもこうした多少の時間のかかるタスクについて同様に音による通知を行わせたい。
方法
「powershell.exe に Media.SoundPlayer オブジェクトを生成し同期再生させるワンライナー」を task test
に仕込む例を挙げる。
tasks.json:
{ "version": "0.1.0"
, "command": "sh"
, "isShellCommand": true
, "showOutput": "always"
, "args": [ "-c" ]
, "tasks":
[ { "taskName": "test"
, "suppressTaskName": true
, "args": [ "powershell.exe -Command '(New-Object Media.SoundPlayer(\\\"c:\\windows\\media\\alarm02.wav\\\")).PlaySync()'" ]
}
]
}
音を鳴らすだけならば top-level に sh
-c
を渡す必要は無いが、前回の流れで任意の複数のコマンドを task で扱っている状況を想定した例とした。
これを応用して、以下のように mkdir
cd
cmake
ninja
からなる一連のビルドタスクの完了時に音を鳴らしして通知する task を vscode で実現できる。
"args": [ "mkdir build; cd build && cmake .. -G Ninja && ninja; powershell.exe -Command '(New-Object Media.SoundPlayer(\\\"c:\\windows\\media\\alarm02.wav\\\")).PlaySync()'" ]
また、この方法は Windows 以外の環境でもそれぞれの環境にあわせた方法で同様に実現できる。あるいは Windows の powershell.exe
を使う際には音声の再生以外にもインタラクティブシェル動作を要求しない機能であれば多くの場合に強引に組み込み可能である。
蛇足
-
Play
ではpowershell.exe
は再生が始まるとほとんど同時に終了してしまい、結果非同期再生が行われない。そこでPlaySync
により同期再生とするのが簡単な解決となった。 - 他の環境では、最も簡単には
echo -e "\a"
でベル制御文字をターミナルへ送る方法があるが、 vscode から実行される上ではベルを受け取っても音は出ないようなので使えない。
ひとこと
多重エスケープは疲れるのであまり書きたいものではありませんが、タスク完了や中間ポイントでのサウンド通知はたいへん便利なので悩ましいところです。 vscode 本体機能としてタスク周りが強化されれば多重エスケープやコマンドによる強引なサウンド再生手法に頼る必要も無くなるかもしれませんね。