Bash
msys2
VisualStudioCode

Visual Studio Code 15.1の統合シェルをMSYS2のbashにする

対象とするVSCodeのバージョン

15.1 or later

先行研究

まずもって、この話をググると、msys2のgitを使う話が混ざってきて、それだけでもggrbility(検索可能性)がない。

まあまず引っかかるのは

Visual Studio CodeのIntegrated Terminalでmsys2のzshを使う - 備忘録β版
http://yami-beta.hateblo.jp/entry/2016/06/08/000000

だろう。

すると

mattnさんによる実行モジュールがあるようなので、そちらを用いると良さそうです。(コメント欄参照)
Visual Studio Code で msys2 の bash を使う方法 · GitHub

とか言われて、見に行くと

go で bash-login.go をビルドした後、出来上がった exe を以下の様に指定する。

え、goでビルド・・・?って思いがあふれる。一回作ればいいって言ったってだるいものはだるい。

他に情報がないかと思って見ていると

Visual Studio Codeの統合シェルをMSYS2のBashにしたら.bash_profileが読み込まれなかった - Qiita
http://qiita.com/catfist/items/ea925fb9e0ba5c0ba9f3

というのが見つかるが、

ワークスペースを作業ディレクトリとして開いてくれない

とか言っている。しかもその解決のためにVSCodeの拡張を使うとかいう暴挙に出ている。ゼッテー嫌だ。

Visual Studio Codeの統合シェルをMSYS2のbashにするには

setting.json
{
    "terminal.integrated.shell.windows": "C:\\msys64\\usr\\bin\\bash.exe",
    "terminal.integrated.env.windows": {
        "MSYSTEM": "MINGW64",
        "CHERE_INVOKING": "1"
    },
    "terminal.integrated.shellArgs.windows": [
        "--login"
    ],
    "terminal.integrated.cursorStyle": "line"
}

を設定に書けば良い。terminal.integrated.cursorStyleは好みで。

解説

terminal.integrated.shell.windows

bashへのフルパスを指定する。このときmsys2のbashではないなにか(ex. git-bashのbash)を指定してはだめだ。

terminal.integrated.env.windows

環境変数を設定できる。

MSYSTEM

msys2ユーザーならご存知と思うが、$PATHが3種類(/usr/bin, /mingw32/bin, /mingw64/bin)あるのに対応していて、MSYS, MINGW32, MINGW64がある。

MSYSはmsys2のパッケージを作るときとか以外はお世話にならない(わけでもない

MINGW32はgccの例外モデルがBorlandの特許の関係でSEHではなくdwarfなi686向けの環境である。

MINGW64はおそらくもっともよく使う環境だ。

CHERE_INVOKING

bashにログイン時に作業ディレクトリを環境変数$HOMEのパスにするかを決めるフラグで、1に設定すると移動を阻止します。

Visual Studio Codeの統合シェルをMSYS2のBashにしたら.bash_profileが読み込まれなかった - Qiita
http://qiita.com/catfist/items/ea925fb9e0ba5c0ba9f3
ワークスペースを作業ディレクトリとして開いてくれないとか言っていたのはこれを設定していないせいだ@catfist さんみたいに、わざわざVSCodeの拡張を使う必要はない。

まあmsys2_shell.cmdの中身が奇っ怪すぎるのでわからなくても仕方ない感はある。

参考リンク:

terminal.integrated.shellArgs.windows

--loginを渡している。-lでも同じだ。

ここでbashのmanを読んでみよう。

BASH(1)                                                      General Commands Manual                                                     BASH(1)

NAME
       bash - GNU Bourne-Again SHell
OPTIONS
       -l        Make bash act as if it had been invoked as a login shell (see INVOCATION below).

       --login
              Equivalent to -l.

       --noprofile
              Do  not  read  either  the  system-wide  startup  file  /etc/profile  or any of the personal initialization files ~/.bash_profile,
              ~/.bash_login, or ~/.profile.  By default, bash reads these files when it is invoked as a login shell (see INVOCATION below).

まあsee INVOCATION belowとか言っているが自分で読んでくれ。要約すると、-lまたは--loginをつけないと~/.bash_profileは読み込まないぞ、となる。

詳しくはログインシェルとインタラクティブシェルのお話なので

を参照のこと。

terminal.integrated.cursorStyle

なくても動く

ターミナルのカーソルの形状を選べる。規定は"block"だ。私は線状のほうが好きなので"line"にした。

最後に

image.png

やったぜ。