如何将MSYS2 shell集成到Window上的Visual Studio代码中?

pbe*_*eta 13 bash shell msys2 visual-studio-code

我试图将MSYS2 shell集成到Visual Studio Code集成终端中.这是我的用户设置:

{
    "terminal.integrated.shell.windows": "C:\\msys64\\usr\\bin\\bash.exe",
    "terminal.integrated.shellArgs.windows": ["--login", "-i"]
}
Run Code Online (Sandbox Code Playgroud)

但是,我遇到了--login将当前工作目录更改为Windows主页的问题.我希望当前目录位于我的工作区的根目录.

我的进一步尝试是我尝试添加一个标志-c 'cd ${workspaceRoot}'.然而,bash会在开始时崩溃.我可以正确得到当前目录中去除--login,但没有登录模式,所有其他的shell命令(ls,cd,等)不可用.

如何将MSYS2 shell正确集成到我的vscode中?

Ali*_*i80 47

这里的答案来自旧方法,该方法现在(2021 年 7 月)在 VSCode 中已弃用,新建议的方法是将其添加到 settings.json 中:

"terminal.integrated.profiles.windows": {
    "PowerShell": {
      "source": "PowerShell",
      "icon": "terminal-powershell"
    },
    "Command Prompt": {
      "path": [
        "${env:windir}\\Sysnative\\cmd.exe",
        "${env:windir}\\System32\\cmd.exe"
      ],
      "args": [],
      "icon": "terminal-cmd"
    },
    "Git Bash": {
      "source": "Git Bash"
    },
    "MSYS2": {
      "path": "C:\\msys64\\usr\\bin\\bash.exe",
      "args": [
        "--login",
        "-i"
      ],
      "env": {
        "MSYSTEM": "MINGW64",
        "CHERE_INVOKING": "1"
      }
    }
  },

Run Code Online (Sandbox Code Playgroud)

参考:integrated-terminal#_configuring-profiles

  • 除此之外,您应该添加到 settings.json 文件中的文本是“MSYS2”文本并向下。 (3认同)

小智 24

要禁止从当前目录更改工作目录,请将CHERE_INVOKING环境变量设置为非空值:

    "terminal.integrated.env.windows": {
        "CHERE_INVOKING": "1"
    },
Run Code Online (Sandbox Code Playgroud)

在MSYS登录脚本中,设置CHERE_INVOKING变量仅用于防止shell执行cd "${HOME}",而不是其他任何操作.

如果需要MinGW工具链,请设置MSYSTEM环境变量以选择工具链.识别的值是MSYS(默认值),MINGW32或MINGW64.

    "terminal.integrated.env.windows": {
        "MSYSTEM": "MINGW64",
    },
Run Code Online (Sandbox Code Playgroud)

完整的,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",
    },
}
Run Code Online (Sandbox Code Playgroud)

提供一些关于非常神秘的术语的上下文CHERE_INVOKING:chere显然是一个Cygwin命令,用于安装和管理"Command Prompt Here"文件夹上下文菜单项.虽然MSYS2从Cygwin继承了环境变量,但它实际上并不继承命令本身.


col*_*ola 10

原始但不能100%工作(作为答案接受)

这将正确启动MSYS2 bash shell,以便执行.bash_login:

"terminal.integrated.shell.windows": "C:\\msys64\\msys2_shell.cmd",
"terminal.integrated.shellArgs.windows": ["-defterm", "-mingw64", "-no-start", "-here"]
Run Code Online (Sandbox Code Playgroud)

编辑

原来的答案似乎在当时有效,但当我尝试在VSCode中开始使用任务时,它显然无法正常工作.尝试运行一个简单调用make all的任务会导致以下错误:

/ 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"
},
Run Code Online (Sandbox Code Playgroud)

.bashrc中:

if [ ! -z "$MSVSCODE" ]; then
    unset MSVSCODE
    source /etc/profile
    cd $OLDPWD
fi
Run Code Online (Sandbox Code Playgroud)


Rod*_*dez 7

这对我有用:

{
    "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"
    }
}
Run Code Online (Sandbox Code Playgroud)