在 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