在 Visual Studio Code 中使用 msys shell

Posted

技术标签:

【中文标题】在 Visual Studio Code 中使用 msys shell【英文标题】:Using msys shell in Visual Studio Code 【发布时间】:2017-04-09 03:55:34 【问题描述】:

我喜欢 Visual Studio Code,因为我喜欢它的轻量级设计和灵活性。它有一个集成终端,我相信它可以运行任何 shell [see here]。我想用它运行我最近一直在使用的 msys shell。将终端设置为运行默认 powershell.exe 以外的另一个 shell 应该与更改设置一样简单,如[here] 所述。但是,我按照 mingw.org 上的建议,通过运行 msys.bat 文件来使用 msys shell。

所以我的问题是,我需要将终端设置为 msys shell 的 .exe 文件在哪里?或者以这种方式在没有 .bat 的情况下运行这个 shell 是不可能的?谢谢!

【问题讨论】:

How do I integrate MSYS2 shell into Visual studio code on Window?的可能重复 【参考方案1】:

根据msys.bat 脚​​本,启动的实际可执行文件取决于您的 TTY 设置。默认设置使用本机命令提示符并启动sh.exe 文件,您可以从以下sn-p 中看到:

:startsh
if NOT EXIST %WD%sh.exe goto notfound
start %WD%sh --login -i
exit

要让它在 Visual Studio Code 中工作,您需要添加以下用户设置:

"terminal.integrated.shell.windows": "C:\\MinGW\\msys\\1.0\\bin\\sh.exe",
"terminal.integrated.shellArgs.windows": ["--login", "-i"]

sh.exe 文件的路径可能因 MSYS 的安装位置而异。

编辑:(2019-01-20)

虽然上述方法仍然适用于 MSYS v1.0,但我已经切换到 MSYS2 (https://www.msys2.org/)。您可以使用以下设置来设置您的 Visual Studio Code 以与 MSYS2 一起使用,就像 v1.0 一样(再一次,您的安装位置可能与我的不同):

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

为了额外的功劳,我们将修改一个环境变量,以便我们始终在当前目录中打开终端。通过脚本等有多种方法可以完成此操作。但是,在我看来,最简单的方法是使用CHERE_INVOKING 环境变量。通过将此标志设置为1,它将通知shell 使用当前目录作为默认入口点。以下是有关如何启用此标志的完整教程:

    按 windows 键并输入 run 并回车

    在运行对话框中,输入以下内容:

    rundll32.exe sysdm.cpl,EditEnvironmentVariables
    

    在打开的环境变量对话框中,添加一个名为CHERE_INVOKING 的新用户变量并将其值设置为1

在 Windows 系统中启用此标志后,它应该会自动从您调用 bash.exe 可执行文件的位置打开终端。对于 Visual Studio Code,这将是您的项目根目录。享受!

【讨论】:

太棒了!谢谢@JonnyMorrill。现在,这对你来说很难:如何让 MSYS shell 在我启动终端时自动 cd 到我所在的任何 VS Code 项目的根目录? @deduper 很久以前就问过这个问题,但是要达到你的要求(即 cd 在 VS Code 项目的目录中),请在下面查看我的分析器:***.com/a/51078800/1603480 @deduper - 抱歉,我已经有一段时间没有注意到这一点了。我用我目前用来启用此功能的另一个解决方案更新了答案。 @Jean-FrancoisT。 - 非常好的解决方案!我通过设置环境变量标志添加了另一种方法来完成此操作。对于不想编辑环境变量的用户来说,您的设置非常好。 您可以使用“terminal.integrated.env.windows”而不是直接将环境变量添加到系统中。例如,您还可以将 MSYSTEM 设置为使用 MINGW64 而不是普通的 MSYS。【参考方案2】:

上一个答案的扩展:

为了让它在你当前的工作目录中打开,出于某种原因,它必须首先通过本机 shell 运行它。我们可以使用 令人难以置信的直观 PowerShell 包装器来设置 cd 并启动 bash 或其他 shell。

这是让它为我工作的配置:

"terminal.integrated.shell.windows": "C:\\WINDOWS\\System32\\WindowsPowerShell\\v1.0\\powershell.exe",
"terminal.integrated.shellArgs.windows": [
    "C:\\msys64\\usr\\bin\\sh.exe",
    "--login",
    "-i",
    "-c",
    "(\"cd \\`\"``cygpath '0'``\\`\"; /usr/bin/bash --login -i\" -f (Resolve-Path .).Path )"
],

您可以根据需要将bash 替换为不同的shell,例如zsh

Bash 和 JSON 转义使用 \ 字符,但 PowerShell 使用 ` 代替,然后 bash 会尝试使用它来执行命令,因此请注意所有转义字符。

此外,您必须指定 PowerShell 二进制文件,而不是内置的 "PowerShell" shell。老实说,我不知道为什么。

【讨论】:

【参考方案3】:

要在项目文件夹中打开 MSys,您只需

A.在 Visual Code 的个人设置中添加以下设置(假设您的 Msys 文件夹为C:\msys\1.0):

"terminal.integrated.shell.windows": "C:\\msys\\1.0\\Run_MSYS.bat",

B.将getcp.exe复制到MSys的bin文件夹中(即C:\msys\1.0\bin);你可以在这里找到它:https://github.com/msysgit/msysgit/blob/master/mingw/bin/getcp.exe

C.在您的 MSys 文件夹中创建文件 Run_MSYS.bat,如下所示:

@rem Do not use "echo off" to not affect any child calls.
@SETLOCAL
@SETLOCAL ENABLEEXTENSIONS

:: Figure out where msys's root folder. If you want, you could just add the folder in the line
:: below.
@set MSYSROOT=
@if "x%MSYSROOT%"=="x" @if exist "%~dp0msys.bat" @set MSYSROOT=%~dp0
@if "x%MSYSROOT%"=="x" @if exist "%~dp0.msys-root" @set /P MSYSROOT=<%~dp0.msys-root
@if "x%MSYSROOT%"=="x" (
@echo Could not locate your mysys root folder.
@set /P MSYSROOT=Location:
)
:: Read as MSYSROOT.trim()
@if not "x%MSYSROOT%"=="x" (
@for /f "tokens=* delims= " %%a in ("%MSYSROOT%") do @set MSYSROOT=%%a
@for /f "useback tokens=*" %%a in ('%MSYSROOT%') do @set MSYSROOT=%%~a
@if not "%MSYSROOT:~-1%"=="\" @set MSYSROOT=%MSYSROOT%\
)
:: Verify that root folder exists
@if not exist "%MSYSROOT%" (
@echo "%MSYSROOT%" is not a valid folder. Please check for .msys-root in %~dp0, or if you entered the path above, please rerun this script and select a valid folder.
@exit /B 1
) else (
@if not "%MSYSROOT%"=="%~dp0" @echo %MSYSROOT%>%~dp0.msys-root
)

:: Home Folder
:: If you'd prefer the home directory set to your C:\Users\Username folder, uncomment the two lines
:: below.
@rem @if not exist "%HOME%" @set HOME=%HOMEDRIVE%%HOMEPATH%
@rem @if not exist "%HOME%" @set HOME=%USERPROFILE%
@if not exist "%HOME%" @if not "%MSYSROOT%"=="" @set HOME=%MSYSROOT%home\%USERNAME%
@if not "x%WD%"=="x" @set WD=
@set PLINK_PROTOCOL=ssh
@if not exist "%WD%msys-1.0.dll" @set WD=%MSYSROOT%\bin\
@set MSYSCON=sh.exe

:: Default action, open msys and go to the current folder.
@set OLDCD=%CD%
@if not "x%OLDCD%"=="x" @set CURRCD=%CD%
:: Get the current console ("OEM") codepage.
@for /f %%i in ('"%MSYSROOT%bin\getcp.exe" -oem') do @set cp_oem=%%i
:: Get the current GUI ("ANSI") codepage.
@for /f %%i in ('"%MSYSROOT%bin\getcp.exe" -ansi') do @set cp_ansi=%%i
:: Set the console codepage to match the GUI codepage.
@chcp %cp_ansi% > nul < nul
@if not "x%OLDCD%"=="x" (
@"%MSYSROOT%bin\bash.exe" -l -i -c "cd \"$CURRCD\"; exec /bin/bash -rcfile ~/.bash_profile"
) else (
@"%MSYSROOT%bin\bash.exe" -l
)
:: Store the error level returned by bash.
@set ErrorLevel=%ErrorLevel%
:: Restore the original console codepage.
@chcp %cp_oem% > nul < nul
:: If we had a current directory at the store of the script, go back to it.
@if not "x%OLDCD%"=="x" chdir /D "%OLDCD%"

:: quit script with the current error level.
@exit /b %ErrorLevel%

这是(可能)在此处找到的脚本的较短版本:https://gist.github.com/juntalis/1291621

感谢 Juntalis 的精彩剧本!!

干杯

【讨论】:

【参考方案4】:

根据MSYS terminals,我们可以这样使用:

    "terminal.integrated.profiles.windows": 
        "msys mingw64": 
            "path": "C:/msys64/msys2_shell.cmd",
            "args": [
                "-defterm",
                "-here",
                "-no-start",
                "-mingw64"
            ]
        
    ,

这将启动 msys mingw64。要启动其他 shell,只需将 -mingw64 更改为 -mingw32-msys

【讨论】:

【参考方案5】:

Jonny Morril 的回答帮助了我。 设置时,它会随时自动进入主文件夹。

Here 我为资源管理器菜单找到了一个可行的解决方案。但是你不需要实现这个。导入行是:

如果你尝试一下,你会注意到它打开了一个新的 MSYS 窗口, 但它会自动转到主目录而不是当前目录 您所在的目录。要解决此问题,您需要编辑 “C:\MinGW\msys\1.0\etc\profile”。找到 cd "$HOME" 行(可能 最后一行)并将其注释掉(通过在其前添加 #)。

删除/注释掉该行后,一切正常,无需任何解决方法,例如 Bryan K 的建议。

【讨论】:

【参考方案6】:

进一步完善 Bryan K 的答案:

我们将改为将 MSYS2 配置文件添加到终端配置文件下拉列表中。 在settings.json"terminal.integrated.profiles.windows" 中,我们将为 MSYS2 添加一个新条目,如下所示:

"MSYS2": 
  "source": "PowerShell",
  "args": [
    "C:\\msys64\\usr\\bin\\bash.exe",
    "--login",
    "-i",
    "-c",
    "(\"cd \\`\"``cygpath '0'``\\`\"; /usr/bin/bash --login -i\" -f (Resolve-Path .).Path )"

更改路径以匹配您的 MSYS2 安装(以上是默认路径)。

现在终端下拉菜单中会有一个 MSYS2 选项,它会在当前工作目录中打开。

【讨论】:

【参考方案7】:

今天我遇到了同样的问题,在当前日期(24/10/2021),这对我来说是可行的解决方案: 在文件 settings.json 中,您应该有以下几行:

"terminal.integrated.env.windows": 
    "CHERE_INVOKING": "1" // open mysys terminal at the current path
,
"terminal.external.windowsExec": "C:\\msys64\\mysys2.exe",
"terminal.integrated.defaultProfile.windows": "MYSYS",  // I am using default MYSYS(this line is optional)
"terminal.integrated.profiles.windows": 
    "MYSYS": 
        "path": "C:\\msys64\\usr\\bin\\bash.exe",
        "args": [
            "--login",
            "-i"
        ]
    

【讨论】:

以上是关于在 Visual Studio Code 中使用 msys shell的主要内容,如果未能解决你的问题,请参考以下文章

在 Visual Studio Code 中销毁 TypeScript

visual studio code 怎么用

visual studio code怎么运行代码

Visual Studio 开发:安装配置Visual Studio Code

在Visual Studio Code中配置GO开发环境

在 Visual Studio Code 中使用 Makefile 调试现有项目