C++で競プロをやるためのVSCodeの環境づくり

# はじめに
競プロerの知人に「VSCodeの環境構築、良く分かってないんだよね」と言われたので、自分がWindowsで競プロをやっていた時に設定したことを記事にまとめることにしました。Windows前提で書いていますが、他の環境でも同じ気持ちで設定できるところが多くあると思います。

# 想定環境
Windows 10でMinGW。記事執筆時点でのVSCodeのバージョンは1.27.2(user setup)です。

# 目指すところ
競技プログラミングをC++でそれなりに快適にできるようにする。

具体的には、
- コードの補完ができる
- 簡単にコンパイルできる
- デバッガが使える
- 自作のライブラリを貼れる

あたりをゴールとしています。

# 準備
- MinGWでg++とgdbを入れる
- PATHを通す
- VSCodeをインストール

# VSCodeの設定
目標に挙げた項目を上からクリアしていきます。
## 補完を効かせる
1. 適当なフォルダをVSCodeで開きます。
2. [Ctrl]+[Shift]+[X]で拡張機能ペインを開き、「C/C++」で検索します。検索結果のうち、上の方にいるMicrosoft製の拡張機能「C/C++」をインストールします（執筆時点でのバージョンは0.18.1）。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/254431/53629fdb-65b0-76b4-ce3b-33df2babbef7.png)

3. インストールが終わったら拡張機能を有効にするために「再読み込み」ボタンを押します。上図でロゴのすぐ右にある青いボタンです。
4. [Ctrl]+[,]で設定を開きます。「ワークスペースの設定」ではなく「ユーザー設定」が選択されていることを確認し、右側の[…]ボタン（下図参照）から[settings.jsonを開く]を選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/254431/41b1ab0c-90ec-8adc-bb60-a01642f8ccc4.png)

5. 開いた画面の右側のjsonに、次を追記します。ただし、`[MINGW]`はMinGWをインストールした場所、`[VERSION]`はインストールしたg++のバージョンに応じて置き換えてください。
例えば、私の環境の場合は`"[MINGW]\\lib\\gcc\\mingw32\\[VERSION]\\include\\c++"`を`"D:\\MinGW\\lib\\gcc\\mingw32\\6.3.0\\include\\c++"`と置き換えることになります。

```
    "C_Cpp.default.includePath": [
        "[MINGW]\\include",
        "[MINGW]\\lib\\gcc\\mingw32\\[VERSION]\\include\\c++",
        "[MINGW]\\lib\\gcc\\mingw32\\[VERSION]\\include\\c++\\mingw32"
    ],
    "C_Cpp.default.compilerPath": "[MINGW]\\bin\\g++.exe",
    "C_Cpp.default.cppStandard": "c++14",
    "C_Cpp.default.intelliSenseMode": "gcc-x64",
```
AtCoderやAOJなどのジャッジのことを考えて、C++14を使うことにします。

これで補完が効くようになっているはずです。開いているフォルダに何かc++のファイルを作って試してみてください。includeしたときに緑の波線が引かれるときは`includePath`の設定が不足しているかもしれません。

## 簡単にコンパイルできるようにする
1. 作成したc++のファイルを開いた状態で[Ctrl]+[Shift]+[B]をします。上の方に何かが出てくるので「実行するビルド タスクがありません。ビルド タスクを構成する...」→「テンプレートからtasks.jsonを生成」→「Others」と選択していきます。
2. `tasks.json`が開くので編集します。一例として、`tasks`の中を次のようにすればよいでしょう。

```json
    "tasks": [
        {
            "label": "build",
            "type": "shell",
            "command": "g++",
            "args": [
                "-std=gnu++1y",
                "-g",
                "-O2",
                "${fileBasename}",
                "-o",
                "${fileBasenameNoExtension}.exe"
            ],
            "group": {
                "kind": "build",
                "isDefault": true
            }
        }
    ]
```
`label`はこのタスクの名前なので適当につけてください。`type`は特に気にしなくともよいと思います。`command`はこのタスクで実行されるコマンドです。今はコンパイルがしたいので`g++`を指定しています。PATHが通っていない場合は絶対パスで指定してやれば大丈夫なはずです。`args`はコマンドに渡す引数です。デバッガを使いたいので`-g`を指定しています。これとは別にデバッグ用のビルドタスクを構成し、`launch.json`（後述）の`preLaunchTask`に指定するという方法でも構いません。`${fileBasename}`などは、実行時にファイル名などに置換されます。


また、`group`に上のように書いておくことで、[Ctrl]+[Shift]+[B]でこのタスクが実行されるようになります。先ほど作成したファイルを開き、試してみてください。

~~因みに、`group`に`{"kind": "test", "isDefault": true}`を指定すると[Ctrl]+[Shift]+[T]で実行されるようになります。~~__→これは標準のショートカットではなく、自分で設定したショートカットでした。これをやりたい場合は、「ファイル(F)」→「基本設定(P)」→「キーボードショートカット(K)」から「テスト タスクの実行」コマンドにショートカットを割り当ててください。[2018/09/19 訂正]__

こちらにできたexeの実行であったり、サンプルケースのダウンロード・実行・結果のチェックであったりを仕込んでおくとさらに快適です。

## デバッガを使えるようにする
1. 作成したc++のファイルを開いた状態で[F5]を押します。上の方に「環境の選択」というプレースホルダと色々な選択肢が表示されるので、「C++ (GDB/LLDB)」を選びます。
2. `launch.json`が開くので編集します。`program`にexeの場所（`tasks.json`が上の例の通りなら`"${workspaceFolder}/${fileBasenameNoExtension}.exe"`で良いはず）、`miDebuggerPath`に`gdb.exe`の場所（`"[MINGW]\\bin\\gdb.exe"`）を指定します。
コンパイルなど、デバッガ起動前に何かタスクを実行したい場合は`preLaunchTask`に実行したいタスクの名前を指定します。

これで、c++のファイルを開いてビルドが済んだ状態から[F5]を押すとデバッガが起動するはずです。ブレークポイントもちゃんと動きますし、セグフォったときにどこで死んだかもわかるようになります。標準入出力は、別窓が開くのでそこ経由でできます（`launch.json`に書く設定により変更可能）。

## 自作のライブラリを貼れるようにする
1. メニューより、[ファイル(F)]→[基本設定(P)]→[ユーザー スニペット(S)]を選択します。
2. 「スニペット ファイルの選択もしくはスニペットの作成」と上の方に出てくるので、選択肢の中から「cpp.json (C++)」を選びます。
3. `cpp.json`が開くので、コメントに書いてある例に従って追記していきます。

これで、c++ファイル編集時にスニペットの`prefix`に指定したものから`body`に指定した内容が補完できるようになっています。

## 注意点
補完とライブラリに関してはVSCodeの設定を弄ったので開いているフォルダによらず有効です。しかし、コンパイルやデバッガの利用に関する設定は開いているフォルダ内の`.vscode`フォルダにある`tasks.json`と`launch.json`に保持されています。従って、ほかのフォルダでもこの設定を利用したい場合は`.vscode`フォルダ内にあるファイルをコピーしてやる必要があります。

# さらに快適に
以上で最初に述べた目標は達成できたと思います。最後に、自分がより快適にするためにしている/したいと思っていることを挙げておきます。

- 使いまわしたい内容の`tasks.json`と`launch.json`を分かりやすい所に置いておいて、コピーをバッチファイルを叩くだけでできるようにしておく。
- 問題ページの入出力例をダウンロードして動作チェックを自動で行うものを作る。これを`tasks.json`の設定で[Ctrl]+[Shift]+[T]でできるようにする。
- 自作ライブラリが複数行だと`cpp.json`への入力がつらいので、スニペットの管理を楽にする何かを作っておく。（Linux用ですが[こんな感じ](https://github.com/wisteria0410ss/SnippetManager)のやつ）
- AtCoderに関連するVSCode拡張機能を入れる