Keisuke_00 の資料室

Twitter に乗らない長文、やったこと、メモの置き場

MSYS2(MINGW64)を他アプリの窓で呼び出す

MSYS2(MINGW64)のターミナル環境を VSCode のターミナルペインや Windows Terminal から直接使いたくなって調査した。

動機

特定環境下で何故か MSYS2 の mintty の窓が裏にあっても他のアプリからフォーカスを奪う不調を起こしていた。代替手段が欲しい。

Windows で Go 言語のC言語連携を試そうと思ったらCコンパイラgcc しか対応していなかった。 だったら VSCode のターミナルペインも MSYS2(MINGW64) として使いたい。

標準の MSYS 起動メカニズム

最近の MSYS では mingw64.exe など複数の起動用 exe が提供されている。 これが同じフォルダにある mingw64.ini の環境変数を使って mintty.exe 窓の中で "bash.exe --login" を実行するらしい。

つまり、この呼び出し方のまま mintty.exe の部分を各アプリに差し替える方法が見つかればいいわけだ。

Windows Terminal の場合

MSYSの公式ページにも Windows Terminal の設定方法は記載されているのだが、MINGW64ターミナルとしては環境変数が整っていなかったりとイマイチ中途半端な結果になる。 なので、上記を参考に設定を作り直す。

Windows Terminal の設定画面を開いて、左ペインの一番下「新しいプロファイルを追加」を行う。 設定項目はそれぞれ以下のようにする。${} の部分は各自の環境に合わせる。

# 名前:
"MINGW64"
# コマンドライン:
"${msys64 のパス}\usr\bin\env.exe" MSYS=winsymlinks:nativestrict CHERE_INVOKING=1 MSYSTEM=MINGW64 "${msys64 のパス}\usr\bin\bash.exe" --login 
# 開始ディレクトリ:
"${msys64 の home パス}"
# アイコン
"${msys64 のパス}\mingw64.ico"

コマンドラインに使用している env.exe は、本家の起動方法における mingw64.ini と同じ役割を果たす。 *1 *2 つまり、後ろに記述した環境変数を前提として bash.exe を起動する。 このうち、 "winsymlinks:nativestrict"シンボリックリンクを使わないのであれば設定不要。

ここまでで Windows Terminal のプロファイルは完成する。 これをデスクトップやランチャアプリから一発で起動するショートカットが欲しい場合はさらに以下を行う。

Windows Terminal をストアアプリとしてインストールしている場合、実行ファイルは以下が使えそうだった。 (最初、 wt.exe で検索したら複数出てきたが、どれもランチャからはアクセスできないと怒られる)

C:\Program Files\WindowsApps\Microsoft.WindowsTerminal_1.17.11461.0_x64__8wekyb3d8bbwe\WindowsTerminal.exe

この実行ファイル起動時に引数を渡して起動プロファイルを指定する。 以下は Windows Terminal を新しいウィンドウで「MINGW64」として一発起動するためのパラメータ。*3

"${上記 exe}" -w new nt -p "MINGW64"

ちなみに、ターミナルの文字色設定に元々あった .minttyrc は使えないと思われる。 Windwos Terminal 内の配色設定を新しく作るしか無い。

VSCode の場合

上記と同じコマンドが飛ぶようにJSON設定ファイルを弄ってやる。*4 VSCode の設定画面で以下を検索し、 「JSONを編集」で直接編集に入る。

"terminal.integrated.profiles.windows"

ここにデフォルトでは PowerShellコマンドプロンプトの設定が列挙されている。

一番下に以下を追加すれば「MINGW64」という名前でプロファイルが追加される。

"MINGW64": {
    "path": "${MSYS2のroot}msys64\\usr\\bin\\bash.exe",
    "args": ["--login"],
    "env": {
        "MSYS": "winsymlinks:nativestrict",
        "CHERE_INVOKING": "1",
        "MSYSTEM": "MINGW64"
    }
}

VSCodeの場合は環境変数の設定に "env" フィールドが使えるため、 起動コマンドに env.exe は不要。

さらに、VSCodeのデフォルトターミナルをMINGW64にしたければ、 "terminal.integrated.profiles.windows" の外側に以下を記載する。

"terminal.integrated.defaultProfile.windows": "MINGW64",

最終的なJSONの様子。

"terminal.integrated.profiles.windows": {
    "他のプロファイル": {
    },
    "MINGW64": {
        "path": "C:\\Dev-Registered\\msys64\\usr\\bin\\bash.exe",
        "args": ["--login"],
        "env": {
            "MSYS": "winsymlinks:nativestrict",
            "CHERE_INVOKING": "1",
            "MSYSTEM": "MINGW64"
        }
    }
},
"terminal.integrated.defaultProfile.windows": "MINGW64",

その他

場合によってはMSYS2の中でVisualStudio用の環境を作りたい時がある。これは方法検討中。 *5

*1:ログイン時またはシェル生成時の環境変数、コマンド置換の設定 https://envader.plus/course/12/scenario/1123

*2:ログインシェルとは?非ログインシェルとの違いも併せてご紹介 – Rainbow Engine https://rainbow-engine.com/loginshell-nonloginshell-difference/

*3:Windows ターミナルのコマンド ライン引数 | Microsoft Learn https://learn.microsoft.com/ja-jp/windows/terminal/command-line-arguments?tabs=windows

*4:Visual Studio Code の統合ターミナルで MSYS2 の bash を選択できるようにする - Qiita https://qiita.com/chirimen/items/04e2e10c86c9ecd1e158

*5:MSYS2 から Visual C++ (の環境変数を設定するバッチファイル)を叩く | 雑記帳
https://blog.miz-ar.info/2016/02/msys2-vcvars-bat/