Visual Studioの外部ツール機能を活用してみよう

こんにちはー！ニアです。
ここでは、Visual Studioの外部ツール機能の活用法について紹介します。

#1. Visual Studioの外部ツール機能とは？
Visual Studioの外部ツール機能では、GUID作成やコマンドプロンプトなどのツールを簡単に呼び出すことができます。

![1-1.png](https://qiita-image-store.s3.amazonaws.com/0/78881/86512fab-090d-fca8-7d30-b354d8c8a32e.png)

ここにコンピューター上の任意の実行ファイルを登録することもできます。 

#2. gnuplotをVisual Studioの外部ツールに登録してみよう
ここでは「[**gnuplot**](http://www.gnuplot.info/)」を例に外部ツールに登録してみましょう。

>--- **gnuplotとは？** ---
gnuplotとは、コマンドラインから操作するフリーのグラフ描画ツールアプリケーションです。Windows / Mac / Linuxなどに対応しており、2次元のグラフはもちろんのこと、3次元のグラフをプロットすることができます。

>また、外部のデータファイルを読み込んでプロットすることもでき、例えば、プログラムからCSVファイルなどを作成して、gnuplotでグラフを表示するという使い方もできます。

今回はVisual Studioの外部ツールに登録することで、データファイルのあるディレクトリに移動するために、いちいちcdコマンドをタイプしなくて済むようにしていきます。

##Take-1. メニューバーから、「ツール（T）」→「外部ツール（E）」を選択します
![1-2.png](https://qiita-image-store.s3.amazonaws.com/0/78881/af1f8479-9766-6e1c-c851-2ebc243457f0.png)

##Take-2. 外部ツール設定画面で「追加（A）」ボタンをクリックします
![1-3.png](https://qiita-image-store.s3.amazonaws.com/0/78881/163adc9b-76cf-be09-702a-b88e29eeeed3.png)

##Take-3. 「タイトル（T）」、「コマンド（C）」、「引数（R）」、「初期ディレクトリ（I）」を入力します
![1-4.png](https://qiita-image-store.s3.amazonaws.com/0/78881/541bd1b7-7d6f-a9dd-8de3-d37b73b39598.png)
  
* 「**タイトル（T）**」には、メニューに表示する名前を入力します。また、**&**マークに英字（大文字）を付けると、アクセラレータキーを利用することができます。
* 「**コマンド（C）**」には、外部ツールに登録する実行ファイルのパスを入力します。（gnuplotの場合、「wgnuplot.exe」のパスを入力します）
* 「**引数（R）**」には、「**コマンド（C）**」に入力した実行ファイルの起動オプションを入力します。
* 「**初期ディレクトリ（I）**」には、外部ツールを起動した時のカレントディレクトリを入力します。ここでは、「**$(BinDir)**」（作成するバイナリ（実行ファイルやDLL）のディレクトリを表す特殊な文字列）を入力します。

※ちなみに、実行ファイルにおける相対パスの起点はデフォルトで「**作成されるバイナリ（実行ファイルやDLLなど）のディレクトリ**」となっています。

必要な項目を入力したら、OKボタンまたは適用ボタンをクリックます。

※Visual Studioでは、プロジェクトやソースファイルのディレクトリなどを表す「[**外部ツール引数**](https://msdn.microsoft.com/ja-jp/library/ekbzk5f8.aspx)」が定義されています。

以下に外部ツールの引数いくつか示します。

|外部ツール引数|内容|
|:---:|---|
|\$(ItemPath)|現在編集しているファイルの絶対パス|
|\$(ItemDir)|現在編集しているファイルのディレクトリ|
|\$(ItemFilename)|現在編集しているファイルの名前|
|**\$(BinDir)**|**作成するバイナリ（実行ファイルやDLLなど）のディレクトリ**|
|\$(TargetDir)|作成するアイテム（オブジェクトファイルなど）のディレクトリ|
|\$(ProjectDir)（注）|現在のプロジェクトのディレクトリ|
|\$(SolutionDir)|現在のソリューションのディレクトリ|


* 注：リンク先のMSDNライブラリ側では「\$(ProjDir)」とありますが、実際に定義されているのは「**\$(ProjectDir)**」です。

gnuplotを外部ツールに登録したら、早速起動してみて、カレントディレクトリが初期ディレクトリに移動しているかどうか確認してみましょう（「pwd」コマンドで確認できます）。

![1-5.png](https://qiita-image-store.s3.amazonaws.com/0/78881/582a6bb8-b88d-e613-2232-e2acea869f47.png)

これで、cdコマンドを打つ手間が省けて、作業が捗りますね！

それでは、See you next!

#**※ C++プロジェクトでVisual Studioから実行する場合**
大体のプロジェクトでは、相対パスの起点が作成される作成するバイナリ（実行ファイルやDLLなど）のディレクトリなので、初期ディレクトリを「\$(BinDir)」に設定すればOKです。
ただし、**C++プロジェクトでかつ、Visual Studioから実行する**場合、相対パスの起点が**プロジェクトのディレクトリ**となるので、初期ディレクトリを「**\$(ProjectDir)**」に設定します。

#【付録】外部ツール機能の活用例

ここでは他のツールにおける、外部ツール機能の活用例を紹介していきます。

##Ex1. Visual Studioの「開発者コマンドプロンプト」

コマンドプロンプトを外部ツールに登録します。
![1-6.PNG](https://qiita-image-store.s3.amazonaws.com/0/78881/294df12a-e640-ec39-8091-ed72b8d41bc0.png)

|項目|値|
|---|---|
|コマンド（C）|コマンドプロンプトのファイルパス（C:\Windows\System32\cmd.exeまたは%comspec%）|
|引数（R）|%comspec% **/k ""[C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\Tools\VsDevCmd.bat]""**[^1][^2]|
|初期ディレクトリ（I）|$(ItemDir)|

これで、外部ツールから開発者コマンドプロンプトを起動し、現在編集しているファイルのディレクトリに移動させることができます。現在編集しているソースファイルをコンパイルしたい時に操作が捗りますね！
![1-7.PNG](https://qiita-image-store.s3.amazonaws.com/0/78881/13c9c54f-696c-026b-ede8-027b310c250a.png)


[^1]: パス内の「Microsoft Visual Studio XX.X」の「X.X」の部分には、Visual Studioの内部バージョンが入ります。VS2015では「14.0」、VS2013では「12.0」、VS2012では「11.0」です。
[^2]: VS2017では、VS2015以前からパスが変わり、「C:\Program Files (x86)\\**Microsoft Visual Studio\2017\Community**\Common7\Tools\VsDevCmd.bat」となります。なお、執筆時点（v15.0.26228.4）では、「VsDevCmd.bat」を実行すると、外部ツールで指定した初期ディレクトリではなく、「C:\\[ユーザー\]\Source」に移動します。

##Ex2. NuGet.exe

まず、NuGet.exeを適当なフォルダーに配置します。そのフォルダーの中に以下のパッチファイル（ここではファイル名を「nuget.bat」にしています）を追加します。

```bat:nuget.bat
@echo off
echo Setting environment variables for NuGet.exe ...
rem NuGet.exeが入っているディレクトリを環境変数に一時的に追加します。
set PATH=[NuGet.exeが入っているディレクトリ];%PATH%
echo Done.

rem ここで表示する文はNuGetのオプションの例です。
echo How to use
echo ・Update NuGet.exe : nuget update -self
echo ・Create Nuspec File : nuget spec
echo ・Pack NuGet : nuget pack [Name].nuspec
echo ・Pack NuGet( .NET ) : nuget pack [Project].csproj
```

次にコマンドプロンプトを外部ツールに登録します。
![1-8.png](https://qiita-image-store.s3.amazonaws.com/0/78881/cf5de180-4408-e122-6926-da5c2323d31d.png)


|項目|値|
|---|---|
|コマンド（C）|コマンドプロンプトのファイルパス（C:\Windows\System32\cmd.exeまたは%comspec%）|
|引数（R）|%comspec% **/k ""[nuget.batのパス]""**|
|初期ディレクトリ（I）|**$(ProjectDir)**|

これで、外部ツールからコマンドプロンプトを起動し、現在のプロジェクトのディレクトリに移動させることができます。また、「nuget」とタイプするだけでNuGet.exeが起動するので、パッケージの作成が捗りますね！
![1-9.png](https://qiita-image-store.s3.amazonaws.com/0/78881/aaf2b0a2-d35d-a753-bf36-6268edb740d8.png)