Visual Studio Code の統合ターミナルで MSYS2 の bash を選択できるようにする

## 要約

Visual Studio Code 1.55 では統合ターミナルを起動する際に[プロファイルを選択できるようになりました](https://code.visualstudio.com/updates/v1_55#_integrated-terminal)。この記事では MSYS2 の bash を起動するためのプロファイルの設定方法を紹介します。（追記: 1.56 で[環境変数の設定もできるようになりました](https://code.visualstudio.com/updates/v1_56#_terminal)ので、記事の一部を修正しています。修正後の記事では 1.57.0 の環境を基にしています）

設定するには、次のようなプロパティ **terminal.integrated.profiles.windows** を settings.json に追加します。詳細は後で解説しますが、"PowerShell", "Command Prompt", "Git Bash" がデフォルト設定からコピーした部分で、"MSYS2 Bash" が追加した設定になります。

```jsonc:settings.json
	// ターミナルのドロップダウンを使用して新しいターミナルを作成するときに表示する Windows プロファイル。除外する場合は null に設定し、検出された既定の構成を使用する場合は `source` プロパティを使用します。または、`path` とオプションの `args`. を設定します
	"terminal.integrated.profiles.windows": {
		"PowerShell": {
			"source": "PowerShell"
		},
		"Command Prompt": {
			"path": [
				"${env:windir}\\Sysnative\\cmd.exe",
				"${env:windir}\\System32\\cmd.exe"
			],
			"args": []
		},
		"Git Bash": {
			"source": "Git Bash"
		},
		"MSYS2 Bash": {
			"path": [
				"C:\\msys64\\usr\\bin\\bash.exe"
			],
			"args": [
				"--login"
			],
			"env": {
				"MSYSTEM": "MINGW64",
				"CHERE_INVOKING": "1"
			}
		},
```


## はじめに

最近の VSCode (March 2021, Version 1.55 以降) では統合ターミナルを起動する際に[プロファイルを選択できるようになりました](https://code.visualstudio.com/updates/v1_55#_integrated-terminal)。Windows では PowerShell, Command Prompt, Git Bash などが使用できるようになっています (Git Bash を使用するには Windows 用の Git がインストールされている必要があります)。

MSYS2 Bash を起動するための設定を統合ターミナルのプロファイルに追加すると、統合ターミナルで MSYS2 を使用できるようになります。また、用途に応じて複数のプロファイルをドロップダウンメニューで切り替えることが可能です。 

下図は、VSCode 1.57.0 における統合ターミナルのドロップダウンメニューです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/69237/61578f56-edfd-9778-6f61-f7e5a86ae6f2.png "VSCode 1.57.0 統合ターミナルのドロップダウンメニュー")


## 設定

### terminal.integrated.profiles.windows

Windows 用の統合ターミナルのプロファイルは **terminal.integrated.profiles.windows** で設定されています。VSCode 1.57.0 の規定の設定 (defaultSettings.json) では該当箇所は下記のようになっています。

```jsonc:defaultSettings.json
	// ターミナルのドロップダウンを使用して新しいターミナルを作成するときに表示する Windows プロファイル。除外する場合は null に設定し、検出された既定の構成を使用する場合は `source` プロパティを使用します。または、`path` とオプションの `args`. を設定します
	"terminal.integrated.profiles.windows": {
		"PowerShell": {
			"source": "PowerShell",
			"icon": "terminal-powershell"
		},
		"Command Prompt": {
			"path": [
				"${env:windir}\\Sysnative\\cmd.exe",
				"${env:windir}\\System32\\cmd.exe"
			],
			"args": [],
			"icon": "terminal-cmd"
		},
		"Git Bash": {
			"source": "Git Bash"
		}
	},
```

ここで "PowerShell", "Command Prompt", "Git Bash" が各プロファイルのキーであり、ドロップダウンメニューの項目名の元になります。

プロファイルの内容を見ると、`source` が設定されている場合と、`path` と `args` が設定されている場合の2通りがあることがわかります。設定ファイルのコメントにあるように、`source` は VSCode が検出する規定の設定を使用する場合、`path` は実行するファイルを直接指定する場合に設定します。


### MSYS2 Bash の設定を追加する

#### terminal.integrated.profiles.windows にプロファイルを追加する

規定の設定 (defaultSettings.json) の該当箇所を基本設定 (settings.json) の方にコピーして、MSYS2 bash を実行するのに必要な情報を追加します。

本来であれば、**terminal.integrated.profiles.windows** に "MSYS2 Bash" を追加して、`path` と `args` を設定するだけでよいはずでした。

例えば次のように設定すると、統合ターミナルのドロップダウンメニューに "new MSYS Bash" が追加されます。`path` で指定した実行ファイルが存在しないときはメニューに追加されません。表示されないときは `path` の指定内容が正しいかどうか確認してください。

```json:不完全な設定
        "MSYS2 Bash": {
            "path": [
                "C:\\msys64\\usr\\bin\\bash.exe"
            ],
            "args": []
        }
```

### MSYS2 実行環境が設定されるようにする

前節の設定で起動した MSYS2 bash は正しく動作しません。正しい動作に必要な環境変数の設定が不足しているためです。

「[Visual Studio Code 15.1の統合シェルをMSYS2のbashにする](https://qiita.com/yumetodo/items/42132a1e8435504448aa)」によれば、MSYS2 bash を実行する際に環境変数 `MSYSTEM`, `CHERE_INVOKING` を設定し、bash の引数に `--login` を指定する必要があります。

~~引数の方はプロファイルの `args` に指定すればよいのですが、環境変数を指定することができません。プロファイルの属性に `env` のようなものはなさそうです[^1]。~~

~~ここでは bash の代わりに MSYS2 の env を呼び出すことにしました。MSYS2 の bash が使用できる環境であればたいていは env も使用できるでしょう。他にはラッパーのバッチファイルを自前で用意したり、.bashrc の中でなんとかする方法もあるかと思います。~~

前述したように、VSCode 1.56 以降で `env` が追加され、プロファイル毎に追加の環境変数の設定を行うことが可能となっているので、`env` を使用します。

設定内容は次のようになります。コマンドパスや環境変数 `MSYSTEM` の値などは使用する環境に合わせて読み替えてください。

```json:必要な環境変数とコマンドライン引数を設定
        "MSYS2 Bash": {
            "path": [
                "C:\\msys64\\usr\\bin\\bash.exe"
            ],
            "args": [
                "--login"
            ],
            "env": {
                "MSYSTEM=MINGW64",
                "CHERE_INVOKING=1"
            }
        },
```

唐突に `"overrideName": true` という記述が現れました。

`path` で指定したコマンド名が bash でなく env になったので、実行中の統合ターミナルの表示も "env" となってしまいます。`overrideName` を `true` にすると、コマンド名 "env" の代わりにプロファイルの名前 "MSYS2 Bash" が表示されるようになります。


## まとめ

プロパティ **terminal.integrated.profiles.windows** を settings.json に追加します。

```jsonc:settings.json
	// ターミナルのドロップダウンを使用して新しいターミナルを作成するときに表示する Windows プロファイル。除外する場合は null に設定し、検出された既定の構成を使用する場合は `source` プロパティを使用します。または、`path` とオプションの `args`. を設定します
	"terminal.integrated.profiles.windows": {
		"PowerShell": {
			"source": "PowerShell"
		},
		"Command Prompt": {
			"path": [
				"${env:windir}\\Sysnative\\cmd.exe",
				"${env:windir}\\System32\\cmd.exe"
			],
			"args": []
		},
		"Git Bash": {
			"source": "Git Bash"
		},
		"MSYS2 Bash": {
			"path": [
				"C:\\msys64\\usr\\bin\\bash.exe"
			],
			"args": [
				"--login"
			],
			"env": {
				"MSYSTEM": "MINGW64",
				"CHERE_INVOKING": "1"
			}
		},
```

## 参考
+ [Visual Studio Code 15.1の統合シェルをMSYS2のbashにする](https://qiita.com/yumetodo/items/42132a1e8435504448aa)
+ [Visual Studio Code: Updates March 2021 (Version 1.55) Integrated Terminal](https://code.visualstudio.com/updates/v1_55#_integrated-terminal)

[^1]: コメント欄で insider の VSCode には env サポートが追加されているとの情報をいただきました。env が使用できるとより自然に記述することができますね。~~stable に来るのが楽しみです。~~リリースされたので本文を修正しました。