VSCodeのCode Runnerで実行のオプションをつける(実行ファイル名をa.out、a.exeに変更したい)

2021/04/02投稿

**※最新版は[haroot.net](https://haroot.net/articles/9)に移動しました。**

## はじめに
初心者向けです。

**VSCode**(Visual Studio Code)：ソースコードエディタの一つ。拡張機能が豊富。
**Code Runner**：VSCodeの拡張機能の一つ。VSCodeの画面上で簡単にコンパイルと実行が行えるようになる。

# 背景
VSCodeで実行を簡単にするためにCode Runnerを導入しましたが、
Code Runnerは実行ボタンを押すとデフォルトでは、実行ファイル名は`a.out`や`a.exe`ではなくファイル名から拡張子を抜いたものになります。

例えば HelloWorld.cpp を実行すると、 HelloWorld という実行ファイルが生成されます。
個人的にはソースファイルごとに実行ファイルがあるとフォルダがごちゃごちゃして嫌なので、実行ファイルは全て名前を`a.out`(Windowsなら`a.exe`)に変更して毎回上書きしたいです。
なので今回はCode Runnerの実行オプションの変更を行います。

# 環境
macOS Big Sur 11.2.1
Visual Studio Code 1.55.0
Code Runner 0.11.3

# 手順
VSCodeの設定(拡張機能含む)はsettings.jsonというファイルで行います。

※別の拡張機能で日本語対応(Japanese Language Pack for Visual Studio Code)にしてるので英語の人は適宜読み替えてください
※Windowsの方は`a.out`の記述は全て`a.exe`で読み替えてください。
### settings.jsonを開く
settings.jsonの開き方は何種類かあるので何でも良いですが、とりあえずリンクから開く方法を説明します。
VSCodeを開き、左下の歯車のアイコン(管理)をクリックし、設定を選びます。
開かれた膨大な設定の中から、settings.jsonで編集 と書かれたリンクを開けば完了です。
…ただリンクを探すのがやや面倒で、上の検索欄にemmetなりsettingsなり入力すればそのリンクが出てくると思います。
![スクリーンショット 2021-04-02 1.52.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1156083/43adbf06-aebc-4f4f-d8be-48d40f32ce8e.png)

### jsonファイルの仕様
ここで少しだけ.jsonについて説明します。編集していてエラーになる時は参照してください。

拡張子がjsonのファイルは一行目の`{`と最終行の`}`の間に設定を記述します。
基本的な書き方は`"変数名":"値"`です。また要素はそれぞれカンマで区切る必要があり、最後の要素にはカンマは要りません。
例えば、

```:nantoka.json
{
  "name":"haru",
  "qiita":"@haru8601",
  "age":21
}
```
ここでは変数名も自分で書きましたがsettings.jsonで使う変数名は基本的に与えられるので右側の値だけ書き換えれば良いです。

### settings.jsonの編集
本題に戻ります。

Code Runnerでの実行オプションを決める変数名は`code-runner.executorMap`です。
settings.jsonが開けたら、
一行目の`{`と、最終行の`}`の間のどこかに`code-runner.executorMap`と打ち始めてください。入力してる途中で候補に出てくると思うのでそれを選択してください。
**※要素の前後にカンマを付け忘れるとエラーになるので注意してください**

候補から`code-runner.executorMap`を選択すると以下のような書き込みがされると思います。


```:settings.json
    "code-runner.executorMap": {
        "javascript": "node",
        "java": "cd $dir && javac $fileName && java $fileNameWithoutExt",
        "c": "cd $dir && gcc $fileName -o $fileNameWithoutExt && $dir$fileNameWithoutExt",
        "cpp": "cd $dir && g++ $fileName -o $fileNameWithoutExt && $dir$fileNameWithoutExt",
        "objective-c": "cd $dir && gcc -framework Cocoa $fileName -o $fileNameWithoutExt && $dir$fileNameWithoutExt",
        "php": "php",
        "python": "python -u",
        "perl": "perl",
        "perl6": "perl6",
        "ruby": "ruby",
        "go": "go run",
        "lua": "lua",
        "groovy": "groovy",
        "powershell": "powershell -ExecutionPolicy ByPass -File",
        "bat": "cmd /c",
        "shellscript": "bash",
        "fsharp": "fsi",
        "csharp": "scriptcs",
        "vbscript": "cscript //Nologo",
        "typescript": "ts-node",
        "coffeescript": "coffee",
        "scala": "scala",
        "swift": "swift",
        "julia": "julia",
        "crystal": "crystal",
        "ocaml": "ocaml",
        "r": "Rscript",
        "applescript": "osascript",
        "clojure": "lein exec",
        "haxe": "haxe --cwd $dirWithoutTrailingSlash --run $fileNameWithoutExt",
        "rust": "cd $dir && rustc $fileName && $dir$fileNameWithoutExt",
        "racket": "racket",
        "scheme": "csi -script",
        "ahk": "autohotkey",
        "autoit": "autoit3",
        "dart": "dart",
        "pascal": "cd $dir && fpc $fileName && $dir$fileNameWithoutExt",
        "d": "cd $dir && dmd $fileName && $dir$fileNameWithoutExt",
        "haskell": "runhaskell",
        "nim": "nim compile --verbosity:0 --hints:off --run",
        "lisp": "sbcl --script",
        "kit": "kitc --run",
        "v": "v run",
        "sass": "sass --style expanded",
        "scss": "scss --style expanded",
        "less": "cd $dir && lessc $fileName $fileNameWithoutExt.css",
        "FortranFreeForm": "cd $dir && gfortran $fileName -o $fileNameWithoutExt && $dir$fileNameWithoutExt",
        "fortran-modern": "cd $dir && gfortran $fileName -o $fileNameWithoutExt && $dir$fileNameWithoutExt",
        "fortran_fixed-form": "cd $dir && gfortran $fileName -o $fileNameWithoutExt && $dir$fileNameWithoutExt",
        "fortran": "cd $dir && gfortran $fileName -o $fileNameWithoutExt && $dir$fileNameWithoutExt"
    },
```

ここにはそれぞれの言語と、実行ボタンを押したときに行われるコマンドが表示されています。
例えばc++の場合、`"cpp": "cd $dir && g++ $fileName -o $fileNameWithoutExt && $dir$fileNameWithoutExt"`と書いてあるので、
c++のファイルで実行ボタンを押すと、
1. `$dir`(作業しているディレクトリ)に移動して、
2. `$fileName`(作業しているファイル名)をコンパイルして`$fileNameWithoutExt`(ファイル名から拡張子を抜いた名前)の実行ファイルを生成し、
3. `$dir$fileNameWithoutExt`(作業ディレクトリ内の実行ファイル)を実行します。

今回はファイル名でなく`a.out`を使うので、
2.で生成される実行ファイル名を`a.out`にし、3.での実行ファイル名も`a.out`にします。

```:settings.json
"cpp": "cd $dir && g++ $fileName -o a.out && ./a.out",
```
もちろんc++以外も同様です。
実行は`a.out`だけでなく`./`(カレントディレクトリパス)も必要なことに注意してください。

これでファイルを実行してフォルダに`a.out`が生成されていれば完了です。他の実行ファイルは消しちゃいましょう。

# 参考文献
- [JSON入門 - とほほのWWW入門](http://www.tohoho-web.com/ex/json.html)
- [Code Runnerを使いこなす](https://qiita.com/take_me/items/6a1d2d417889837219d1)