Как интегрировать оболочку MSYS2 в код Visual studio в окне?

Я попытался интегрировать оболочку MSYS2 в интегрированный терминал Visual studio Code. Вот мои настройки пользователя:

{
    "terminal.integrated.shell.windows": "C:msys64usrbinbash.exe",
    "terminal.integrated.shellArgs.windows": ["--login", "-i"]
}

тем не менее, я столкнулся с проблемой, где --login изменяет текущий рабочий каталог на Windows home. Я хочу, чтобы текущий каталог был в корне моей рабочей области.

моя дальнейшая попытка была я попытался добавить флаг -c 'cd ${workspaceRoot}'. Тем не менее, bash разбился бы на старте. Я мог бы правильно добраться до текущего каталога, удалив --login, но без режим входа в систему, все остальные команды оболочки (ls, cd и т. д.) не доступны.

Как правильно интегрировать оболочку MSYS2 в мой vscode?

7 ответов


оригинал, но не работает 100% (принимается в качестве ответа)

это запустит оболочку MSYS2 bash правильно, чтобы ваш .bash_login все запускается на выполнение:

"terminal.integrated.shell.windows": "C:\msys64\msys2_shell.cmd",
"terminal.integrated.shellArgs.windows": ["-defterm", "-mingw64", "-no-start", "-here"]

редактировать

исходный ответ, казалось, работал в то время, но когда я попытался начать использовать задачи в VSCode, он явно не работал. Попытка запустить задачу, которая просто называется сделать все вызвал следующую ошибку:

/ usr / bin / bash: / d: Нет такой файл или каталог
Терминальный процесс завершился кодом выхода: 127

из других ответов, используя "terminal.integrated.shellArgs.windows": ["--login", "-i"] получил почти правильную среду (MSYS вместо MINGW64), но начал в неправильном каталоге, и "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"
},

In .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",
    },

In полный, настройки VS-кода могут выглядеть так:

{
    "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"],
}

{
    "terminal.integrated.shell.windows": "C:\msys64\usr\bin\sh.exe",
    "terminal.integrated.shellArgs.windows": ["--login", "-i"]
}

работал для меня.


при вызове оболочки для выполнения задачи vs code add /d /c аргументы исполняемого файла оболочки, как и для cmd.exe (см. cmd /? в cli). Конечно, MSYS2 bash не интерпретирует /d /c как действительные параметры, поэтому он отвечает /d: No such file or directory как он пытается интерпретировать /d как команду. Я только начал копаться в VSCode, и у меня такое чувство, что какой-то параметр конфигурации отсутствует в конфигурации пользователя, чтобы сказать vscode хороший способ вызова msys2_shell.cmd (т. е. с -c arg) для выполнения задачи (нет pb для интегрированной / интерактивной оболочки, поскольку при вызове bash не передается arg). В любом случае, чтобы преодолеть проблему можно редактировать msys2_shell.cmd ловушка \d \c и вызовите bash с -c:

@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

на принято отвечать работает для меня, но с zsh shell ("terminal.integrated.shell.windows": "C:\msys64\usr\bin\zsh.exe"), вещи много медленнее, чем в bash. Я не знаю, почему, но используя окна 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",
],