Edited at

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

More than 1 year has passed since last update.


対象とする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の中身が奇っ怪すぎるのでわからなくても仕方ない感はある。

参考リンク:


MSYS (opt)

{

"terminal.integrated.env.windows": {
"MSYS": "winsymlinks:nativestrict",
},
}

のように、winsymlinks:nativestrictを指定するとシンボリックリンクが.lnkファイルじゃなくて本物のシンボリックリンクになる。


MSYS2_PATH_TYPE (opt)

MSYS2_PATH_TYPEは環境変数PATHをどうするか決めるものだ。

/etc/profileを覗くと

MSYS2_PATH="/usr/local/bin:/usr/bin:/bin"

MANPATH='/usr/local/man:/usr/share/man:/usr/man:/share/man'
INFOPATH='/usr/local/info:/usr/share/info:/usr/info:/share/info'

case "${MSYS2_PATH_TYPE:-minimal}" in
strict)
# Do not inherit any path configuration, and allow for full customization
# of external path. This is supposed to be used in special cases such as
# debugging without need to change this file, but not daily usage.
unset ORIGINAL_PATH
;;
inherit)
# Inherit previous path. Note that this will make all of the Windows path
# available in current shell, with possible interference in project builds.
ORIGINAL_PATH="${ORIGINAL_PATH:-${PATH}}"
;;
*)
# Do not inherit any path configuration but configure a default Windows path
# suitable for normal usage with minimal external interference.
WIN_ROOT="$(PATH=${MSYS2_PATH} exec cygpath -Wu)"
ORIGINAL_PATH="${WIN_ROOT}/System32:${WIN_ROOT}:${WIN_ROOT}/System32/Wbem:${WIN_ROOT}/System32/WindowsPowerShell/v1.0/"
esac

のように書かれている。通常は指定しなくていいが、strictモードとinheritモードがあることくらい頭に入れておいてもいいかもしれない。


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 (opt)

なくても動く

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


最後に

image.png

やったぜ。