MSYS2 ShellをVisual Studio Code統合端末に統合しようとしました。ユーザー設定は次のとおりです。
{
"terminal.integrated.Shell.windows": "C:\\msys64\\usr\\bin\\bash.exe",
"terminal.integrated.shellArgs.windows": ["--login", "-i"]
}
しかし、--login
が現在の作業ディレクトリをWindowsホームに変更するという問題に遭遇しました。現在のディレクトリをワークスペースのルートに配置したい。
私はさらにフラグ-c 'cd ${workspaceRoot}'
を追加しようとしました。ただし、bashは起動時にクラッシュします。 --login
を削除することで現在のディレクトリに適切にアクセスできましたが、ログインモードがないと、他のすべてのシェルコマンド(ls
、cd
など)は使用できません。
MSYS2 Shellをvscodeに適切に統合するにはどうすればよいですか?
これにより、MSYS2 bashシェルが適切に起動し、。bash_loginが実行されます。
"terminal.integrated.Shell.windows": "C:\\msys64\\msys2_Shell.cmd",
"terminal.integrated.shellArgs.windows": ["-defterm", "-mingw64", "-no-start", "-here"]
元の答えはその時点では機能しているように見えましたが、VSCodeでタスクの使用を開始しようとすると、明らかに機能していませんでした。単にmake allと呼ばれるタスクを実行しようとすると、次のエラーが発生しました。
/ usr/bin/bash:/ d:そのようなファイルまたはディレクトリはありません
端末プロセスは終了コード127で終了しました
他の回答から、"terminal.integrated.shellArgs.windows": ["--login", "-i"]
を使用すると、ほぼ正しい環境(MINGW64ではなくMSYS)が取得されましたが、間違ったディレクトリで開始され、"terminal.integrated.shellArgs.windows": ["-lic", "cd $OLDPWD; exec bash"]
は正しい環境で正しいディレクトリで開始されましたが、タスクを実行できませんでした。
私はこれまでのところうまくいくように見えるこのソリューションを思いつきました。
VSCodeの設定:
"terminal.integrated.Shell.windows": "C:\\msys64\\usr\\bin\\bash.exe",
"terminal.integrated.env.windows":
{
"MSYSTEM": "MINGW64",
//"MSYS2_PATH_TYPE": "inherit",
"MSVSCODE": "1"
},
。bashrc:
if [ ! -z "$MSVSCODE" ]; then
unset MSVSCODE
source /etc/profile
cd $OLDPWD
fi
現在のディレクトリからの作業ディレクトリの変更を禁止するには、CHERE_INVOKING
環境変数を空でない値に設定します。
"terminal.integrated.env.windows": {
"CHERE_INVOKING": "1"
},
MSYSログインスクリプトでは、CHERE_INVOKING
変数の設定は、シェルがcd "${HOME}"
を実行するのを防ぐためだけに機能し、それ以外は何もしません。
MinGWツールチェーンが必要な場合は、MSYSTEM
環境変数を設定してツールチェーンを選択します。認識される値は、MSYS(デフォルト)、MINGW32またはMINGW64です。
"terminal.integrated.env.windows": {
"MSYSTEM": "MINGW64",
},
VS Codeの設定は次のようになります。
{
"terminal.integrated.Shell.windows": "C:\\msys64\\usr\\bin\\bash.exe",
"terminal.integrated.shellArgs.windows": [
"--login",
],
"terminal.integrated.env.windows": {
"CHERE_INVOKING": "1",
"MSYSTEM": "MINGW64",
},
}
CHERE_INVOKING
の非常に不可解な命名法に関するコンテキストを提供するために:chere
は明らかに 「コマンドプロンプト」フォルダーコンテキストメニュー項目をインストールおよび管理するためのCygwinコマンド MSYS2はCygwinから環境変数を継承しますが、実際にはコマンド自体を継承しません。
これは私のために働く:
{
"terminal.integrated.Shell.windows": "C:\\msys64\\usr\\bin\\bash.exe",
"terminal.integrated.shellArgs.windows": ["--login", "-i"],
"terminal.integrated.env.windows":
{
"MSYSTEM": "MINGW64",
"CHERE_INVOKING":"1"
}
}
私はこれを機能させました
{
"terminal.integrated.Shell.windows": "C:\\msys64\\usr\\bin\\bash.exe",
"terminal.integrated.shellArgs.windows": ["-lic", "cd $OLDPWD; exec bash"],
}
受け入れられた答え は私にとってはうまくいきますが、zshシェル("terminal.integrated.Shell.windows": "C:\\msys64\\usr\\bin\\zsh.exe"
)、物事はmashbashよりも遅い。理由はわかりませんが、 ConEmuのcygwin/msysターミナルコネクタ を使用すると非常に役立ちました。
"terminal.integrated.Shell.windows": "C:\\conemu\\ConEmu\\conemu-msys2-64.exe",
"terminal.integrated.env.windows": {
"CHERE_INVOKING": "1",
"MSYSTEM": "MINGW64",
"MSYS2_PATH_TYPE": "inherit",
},
"terminal.integrated.shellArgs.windows": [
"/usr/bin/zsh",
"-l",
"-i",
],
{
"terminal.integrated.Shell.windows": "C:\\msys64\\usr\\bin\\sh.exe",
"terminal.integrated.shellArgs.windows": ["--login", "-i"]
}
私のために働いた。
これは、以下に示すVisual Studio Codeバージョンで動作します
"terminal.integrated.Shell.windows": "C:\\msys64\\usr\\bin\\bash.exe",
"terminal.integrated.shellArgs.windows": ["--login", "-i"],
"terminal.integrated.env.windows":
{
"MSYSTEM": "MINGW64",
"CHERE_INVOKING":"1",
"PATH" : "/mingw64/bin:/usr/local/bin:/usr/bin:/bin:/c/Windows/System32:/c/Windows:/c/Windows/System32/Wbem:/c/Windows/System32/WindowsPowerShell/v1.0/"
},
シェルを呼び出してタスクを実行する場合、コードに対して/d /c
の場合と同様に、cmd.exe
引数をシェル実行可能ファイルに追加します(cliのcmd /?
を参照)。もちろん、MSYS2 bashは/d /c
を有効なパラメーターとして解釈しないため、/d: No such file or directory
をコマンドとして解釈しようとするときに/d
に応答します。私はVSCodeで掘り始めたばかりで、ユーザー設定で設定パラメータが不足していると感じて、vscodeにmsys2_Shell.cmd
(つまり-c
argを使用して)タスクを実行する良い方法を伝えますbashが呼び出されたときに引数が渡されないため、統合/対話型シェルの場合)。とにかく、問題を克服するために、msys2_Shell.cmd
を編集して\d \c
をトラップし、-c
でbashを呼び出すことができます:
@echo off
setlocal
rem usefull get what VSCode pass
rem echo "given params %1 %2 %3 %4 %5 %6 %7 %8 %9"
set "WD=%__CD__%"
if NOT EXIST "%WD%msys-2.0.dll" set "WD=%~dp0usr\bin\"
rem To activate windows native symlinks uncomment next line
rem set MSYS=winsymlinks:nativestrict
rem Set debugging program for errors
rem set MSYS=error_start:%WD%../../mingw64/bin/qtcreator.exe^|-debug^|^<process-id^>
rem To export full current PATH from environment into MSYS2 use '-use-full-path' parameter
rem or uncomment next line
rem set MSYS2_PATH_TYPE=inherit
:checkparams
rem Help option
if "x%~1" == "x-help" (
call :printhelp "%~nx0"
exit /b %ERRORLEVEL%
)
if "x%~1" == "x--help" (
call :printhelp "%~nx0"
exit /b %ERRORLEVEL%
)
if "x%~1" == "x-?" (
call :printhelp "%~nx0"
exit /b %ERRORLEVEL%
)
if "x%~1" == "x/?" (
call :printhelp "%~nx0"
exit /b %ERRORLEVEL%
)
rem Shell types
if "x%~1" == "x-msys" shift& set MSYSTEM=MSYS& goto :checkparams
if "x%~1" == "x-msys2" shift& set MSYSTEM=MSYS& goto :checkparams
if "x%~1" == "x-mingw32" shift& set MSYSTEM=MINGW32& goto :checkparams
if "x%~1" == "x-mingw64" shift& set MSYSTEM=MINGW64& goto :checkparams
if "x%~1" == "x-mingw" shift& (if exist "%WD%..\..\mingw64" (set MSYSTEM=MINGW64) else (set MSYSTEM=MINGW32))& goto :checkparams
rem Console types
if "x%~1" == "x-mintty" shift& set MSYSCON=mintty.exe& goto :checkparams
if "x%~1" == "x-conemu" shift& set MSYSCON=conemu& goto :checkparams
if "x%~1" == "x-defterm" shift& set MSYSCON=defterm& goto :checkparams
rem Other parameters
if "x%~1" == "x-full-path" shift& set MSYS2_PATH_TYPE=inherit& goto :checkparams
if "x%~1" == "x-use-full-path" shift& set MSYS2_PATH_TYPE=inherit& goto :checkparams
if "x%~1" == "x-here" shift& set CHERE_INVOKING=enabled_from_arguments& goto :checkparams
if "x%~1" == "x-where" (
if "x%~2" == "x" (
echo Working directory is not specified for -where parameter. 1>&2
exit /b 2
)
cd /d "%~2" || (
echo Cannot set specified working diretory "%~2". 1>&2
exit /b 2
)
set CHERE_INVOKING=enabled_from_arguments
)& shift& shift& goto :checkparams
if "x%~1" == "x-no-start" shift& set MSYS2_NOSTART=yes& goto :checkparams
rem VS CODE CMD.EXE argument PATCH
if "x%~1" == "x/d" (
if "x%~2" == "x/c" (
rem we got a vs code task issued
echo "VSCODE_TASK detected"
shift& shift
set VSCODE_TASK=yes
goto :checkparams
)
)& shift& goto :checkparams
rem Setup proper title
if "%MSYSTEM%" == "MINGW32" (
set "CONTITLE=MinGW x32"
) else if "%MSYSTEM%" == "MINGW64" (
set "CONTITLE=MinGW x64"
) else (
set "CONTITLE=MSYS2 MSYS"
)
if "x%MSYSCON%" == "xmintty.exe" goto startmintty
if "x%MSYSCON%" == "xconemu" goto startconemu
if "x%MSYSCON%" == "xdefterm" goto startsh
if NOT EXIST "%WD%mintty.exe" goto startsh
set MSYSCON=mintty.exe
:startmintty
if not defined MSYS2_NOSTART (
start "%CONTITLE%" "%WD%mintty" -i /msys2.ico -t "%CONTITLE%" /usr/bin/bash --login %1 %2 %3 %4 %5 %6 %7 %8 %9
) else (
"%WD%mintty" -i /msys2.ico -t "%CONTITLE%" /usr/bin/bash --login %1 %2 %3 %4 %5 %6 %7 %8 %9
)
exit /b %ERRORLEVEL%
:startconemu
call :conemudetect || (
echo ConEmu not found. Exiting. 1>&2
exit /b 1
)
if not defined MSYS2_NOSTART (
start "%CONTITLE%" "%ComEmuCommand%" /Here /Icon "%WD%..\..\msys2.ico" /cmd "%WD%bash" --login %1 %2 %3 %4 %5 %6 %7 %8 %9
) else (
"%ComEmuCommand%" /Here /Icon "%WD%..\..\msys2.ico" /cmd "%WD%bash" --login %1 %2 %3 %4 %5 %6 %7 %8 %9
)
exit /b %ERRORLEVEL%
:startsh
set MSYSCON=
if not defined MSYS2_NOSTART (
start "%CONTITLE%" "%WD%bash" --login %1 %2 %3 %4 %5 %6 %7 %8 %9
) else (
rem integrated Shell called (interactive)
if not defined VSCODE_TASK (
"%WD%bash" --login %1 %2 %3 %4 %5 %6 %7 %8 %9
) else (
rem Call bash with -c arg (execute the command in argument and quit)
rem echo "start %WD%bash" --login -c "%1 %2 %3 %4 %5 %6 %7 %8 %9"
"%WD%bash" --login -c "%1 %2 %3 %4 %5 %6 %7 %8 %9"
)
)
exit /b %ERRORLEVEL%
:EOF
exit /b 0
:conemudetect
set ComEmuCommand=
if defined ConEmuDir (
if exist "%ConEmuDir%\ConEmu64.exe" (
set "ComEmuCommand=%ConEmuDir%\ConEmu64.exe"
set MSYSCON=conemu64.exe
) else if exist "%ConEmuDir%\ConEmu.exe" (
set "ComEmuCommand=%ConEmuDir%\ConEmu.exe"
set MSYSCON=conemu.exe
)
)
if not defined ComEmuCommand (
ConEmu64.exe /Exit 2>nul && (
set ComEmuCommand=ConEmu64.exe
set MSYSCON=conemu64.exe
) || (
ConEmu.exe /Exit 2>nul && (
set ComEmuCommand=ConEmu.exe
set MSYSCON=conemu.exe
)
)
)
if not defined ComEmuCommand (
FOR /F "tokens=*" %%A IN ('reg.exe QUERY "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\ConEmu64.exe" /ve 2^>nul ^| find "REG_SZ"') DO (
set "ComEmuCommand=%%A"
)
if defined ComEmuCommand (
call set "ComEmuCommand=%%ComEmuCommand:*REG_SZ =%%"
set MSYSCON=conemu64.exe
) else (
FOR /F "tokens=*" %%A IN ('reg.exe QUERY "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\ConEmu.exe" /ve 2^>nul ^| find "REG_SZ"') DO (
set "ComEmuCommand=%%A"
)
if defined ComEmuCommand (
call set "ComEmuCommand=%%ComEmuCommand:*REG_SZ =%%"
set MSYSCON=conemu.exe
)
)
)
if not defined ComEmuCommand exit /b 2
exit /b 0
:printhelp
echo Usage:
echo %~1 [options] [bash parameters]
echo.
echo Options:
echo -mingw32 ^| -mingw64 ^| -msys[2] Set Shell type
echo -defterm ^| -mintty ^| -conemu Set terminal type
echo -here Use current directory as working
echo directory
echo -where DIRECTORY Use specified DIRECTORY as working
echo directory
echo -[use-]full-path Use full currnent PATH variable
echo instead of triming to minimal
echo -no-start Do not use "start" command and
echo return bash resulting errorcode as
echo this batch file resulting errorcode
echo -help ^| --help ^| -? ^| /? Display this help and exit
echo.
echo Any parameter that cannot be treated as valid option and all
echo following parameters are passed as bash command parameters.
echo.
exit /b 0