追記
この記事の内容は古くなっています。
を参照してください。
ただしVS Code 1.60.0ではバグがあるようです
対象とする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にするには
{
"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"
にした。
最後に
やったぜ。
追記: ビルドタスクを使うときの注意
ビルドタスクをふつうの設定で動かそうとすると、パス区切り文字の問題から動きません。そこでtasks.json
の構成ごとに
"windows": {
"options": {
"shell": {
"executable": "cmd.exe",
"args": ["/d", "/c"]
}
},
}
のような内容を追記することで、タスクを動かすときだけシェルを切り替えられ、うまくいきます。
ちなみにlanch.json
、つまりデバッグ実行の方はなんかうまく行った試しがありません。