ConEmu:如何将 msys2 称为选项卡?

ter*_*ett 10 tasks conemu

我想创建一个 2x2 的控制台网格,我希望它是我的默认设置,这意味着当我打开 ConEmu 时,这个设置是启动设置。我写了一个如下的任务:

>* cmd -cur_console:n

*powershell -cur_console:s1TVn

cmd /A /Q /K "C:\dev\msys64\msys2_shell.bat" -cur_console:s1THn

ghci.exe -cur_console:s2THn

问题出在最后一个命令上。我想开始msys2,但是当我运行我的任务时,对于第三行,我得到一个控制台,但它不在 ConEmu 内运行,而是将其作为单独的窗口打开。如何修复此配置?

另外,如何在启动 ConEmu 时将此配置设置为默认配置,而现在启动它时,我只能得到一个 cmd 控制台。

jst*_*ine 20

要做的事情其实很简单,一旦你把所有的层都剥掉。这可以很好地用作调用(确保将其修改为您的特定 MSYS2 安装位置):

set CHERE_INVOKING=1 & set MSYSTEM=MINGW64 & "c:\msys64\usr\bin\bash.exe" --login -i
Run Code Online (Sandbox Code Playgroud)

我个人建议将 shell 设置为继承您的 PATH:

set CHERE_INVOKING=1 & set MSYSTEM=MINGW64 & set MSYS2_PATH_TYPE=inherit & "c:\msys64\usr\bin\bash.exe" --login -i
Run Code Online (Sandbox Code Playgroud)

我的 ConEmu 任务设置页面最终看起来像这样: ConEmu 启动::任务页面

打破一切

MSYS2喜欢根据环境变量而不是命令行参数来配置shell。以这种方式将选项传递给程序一开始可能看起来不自然,但基本上它只是遵循这个简单的系列:set VAR=value & set VAR2=value & "c:\path\to\command" [args]

  • CHERE_INVOKING- 如果设置为 1,则 bash 在当前工作目录中启动,否则在用户的主目录中启动。这需要设置为1允许外壳程序按预期从资源管理器窗口上下文菜单中工作。

  • MSYSTEM- 要使用哪个 MSYS2 子系统。共有三种:MSYS、MINGW32 和 MINGW64。该MSYS子系统应该只用于pacman命令操作,所以我通常只在非常罕见的情况下通过 old-skool 开始菜单图标调用它。 MINGW32对少数几个用户来说是无用的,你可能已经知道你是谁了。

  • MSYS2_PATH_TYPE-如果取消设置MSYS使用最小的PATH仅包含MSYS二进制环境和一对夫妇选择Windows系统路径,是一个需要模式的MSYSTEM=MSYS外壳。对于MINGW外壳,建议使用inherit- 我多年来一直使用MSYS2_PATH_TYPE=inherit没有问题。

MSYSCON另一个答案提到了另一个变量,并在msys2_shell.cmd- 忽略它中引用。它仅用于msys2_shell.cmd批处理文件中,与 bash.exe 或 MSYS shell 初始化的行为无关。

MSYS2安装位置

MSYS2 路径是故意硬编码的,c:\msys64\因为这是 MSYS2 Windows 安装程序的默认安装位置。在这种情况下使用没有意义,%ConEmuDir%因为它是相对于 的%PROGRAMFILES%,而 MSYS2 更通常是相对于硬盘驱动器的根目录安装的。请注意,在引用Git for Windows附带的 MSYS2 shell 时使用它确实有意义,因为它相对于.%ConEmuDir%%PROGRAMFILES%

没有简单的方法可以知道 MSYS2 的安装位置。MSYS2 也没有设置环境变量,正如我希望的那样。如果 MSYS2 有一个选项可以将某些东西导出MSYSTEM_HOME到您的机器环境中,那不是很好吗?但事实并非如此,因此作为用户,您完全可以知道它的安装位置并将 ConEmu 指向那里。

关于msys2_shell.cmd

不要使用它。批处理文件的名称不正确。它应该被调用msys2_terminal.cmd或类似,因为它实际上在做的是为 shell 设置整个终端。这是一个常见的术语错误,尤其是在 Windows 操作系统上,终端shell从未真正明确分离。这是它的工作原理,从 Windows 用户的角度解释:

  • Shell - 这是命令处理器和批处理/脚本运行程序。它本质上是一个命令行应用程序,很像任何其他命令行应用程序。外壳甚至不需要任何可见的窗口或键盘连接。它可以完全在后台对文件、流或其他数据输入/输出源进行操作。

  • 终端——这是一个窗口应用程序,它为shell 程序提供键盘/鼠标界面。在 Windows 中,它通常被称为Console Window。键盘命令通过管道传送到 shell 程序,输出显示在带有滚动条、彩色文本和其他有趣功能的窗口内。

在这种情况下,我希望我的终端是ConEmu并且我的 shell 是BASH (mingw64)。因此,我希望ConEmu启动 shell 并且启动 shell。我不希望ConEmu开始mintty。这些都是终端,这会导致我们获得二级弹出窗口——一个用于 ConEmu,另一个用于 mintty。但这正是试图跑步msys2_shell.cmd会做的事情。所以不要使用它。

  • 这个答案对我有很大帮助,但并没有让我到达那里;它给我留下了破碎的 ansi 颜色处理。它无法运行我的 vim 设置。`set "PATH=C:\msys64\usr\bin;%PATH%" & set CHERE_INVOKING=1 & set MSYSTEM=MINGW64 & set MSYS2_PATH_TYPE=inherit & set HOME=/c/Users/Me & "c:\Program Files \ConEmu\ConEmu\conemu-msys2-64.exe" "c:\msys64\usr\bin\bash.exe" --login -i -new_console:p` 这对我有用。我从 git for windows 附带的设置中改编了它。它使用 ConEmu 当前版本附带的 `conemu-msys2-64.exe` 连接器。256 色工作得很好。 (3认同)

小智 18

我在让 MSYS2、MinGW32 和 MinGW64 shell (v2016-12-07) 在 ConEmu v161206 中工作时也遇到了问题。

我发现的唯一(半便携式)工作解决方案如下。

  1. {Shells::mingw-64}在 ConEmu 中为 MinGW64 shell使用名称和以下命令创建一个新任务:

    set MSYSTEM=MINGW64 & set MSYSCON=conemu64.exe & "%ConEmuDir%\..\..\..\msys64\usr\bin\bash.exe" --login -i -new_console:C:"%ConEmuDir%\..\..\..\msys64\mingw64.exe"
    
    Run Code Online (Sandbox Code Playgroud)
  2. {Shells::mingw-32}在 ConEmu 中为 MinGW32 shell使用名称和以下命令创建一个新任务:

    set MSYSTEM=MINGW32 & set MSYSCON=conemu64.exe & "%ConEmuDir%\..\..\..\msys64\usr\bin\bash.exe" --login -i -new_console:C:"%ConEmuDir%\..\..\..\msys64\mingw32.exe"
    
    Run Code Online (Sandbox Code Playgroud)
  3. {Shells::msys2-64}在 ConEmu 中为 MSYS2 shell使用名称和以下命令创建一个新任务:

    set MSYSTEM=MSYS & set MSYSCON=conemu64.exe & "%ConEmuDir%\..\..\..\msys64\usr\bin\bash.exe" --login -i -new_console:C:"%ConEmuDir%\..\..\..\msys64\msys2.exe"
    
    Run Code Online (Sandbox Code Playgroud)

注意:修改上面的相对路径以匹配系统上 MSYS2 的路径。

该解决方案是半便携的,因为它明确说明了 ConEmu 可执行文件(将其更改ConEmu.exe为 x86)。

我不确定MSYSCON环境变量的值是否重要。我只是为了安全才设置它,因为 MSYS2 批处理文件msys2_shell.cmd也设置了它。

另一种方法是使用msys2_shell.cmd批处理脚本。这种方法有一个巨大的缺点,即msys2_shell.cmd通过 WindowsSTART命令生成一个新进程,因此在 ConEmu 中添加了两个选项卡。

  1. {Shells::mingw-64}在 ConEmu 中为 MinGW64 shell使用名称和以下命令创建一个新任务:

    "%ConEmuDir%\..\..\..\msys64\msys2_shell.cmd" -mingw64 -conemu -new_console:C:"%ConEmuDir%\..\..\..\msys64\mingw64.exe"
    
    Run Code Online (Sandbox Code Playgroud)
  2. {Shells::mingw-32}在 ConEmu 中为 MinGW32 shell使用名称和以下命令创建一个新任务:

    "%ConEmuDir%\..\..\..\msys64\msys2_shell.cmd" -mingw32 -conemu -new_console:C:"%ConEmuDir%\..\..\..\msys64\mingw32.exe"
    
    Run Code Online (Sandbox Code Playgroud)
  3. {Shells::msys2-64}在 ConEmu 中为 MSYS2 shell使用名称和以下命令创建一个新任务:

    "%ConEmuDir%\..\..\..\msys64\msys2_shell.cmd" -msys -conemu -new_console:C:"%ConEmuDir%\..\..\..\msys64\msys2.exe"
    
    Run Code Online (Sandbox Code Playgroud)

msys2_shell.cmd旨在被从直接使用CMD.EXE,与ConEmu64.exe/ConEmu.exePATH

msys2_shell -mingw64 -conemu
Run Code Online (Sandbox Code Playgroud)

该命令在 ConEmu 中打开一个新的 MinGW64 选项卡。

tl;dr:我推荐第一种方法。这是 ConEmu 中的一个截图作为证明:

在 ConEmu 中工作 MSYS2 MinGW64 shell


Max*_*mus 5

往里面看msys2_shell.bat就能得到答案。该批次运行 mintty 而不是 bash shell。无用。将第三行更改为完整路径bash.exe -l -i

如何在启动 ConEmu 时将此配置设置为默认配置

ConEmu 中有“启动”设置页面,不是吗?

  • 较新版本的 MSYS2 已适应 ConEmu。现在在默认安装中使用 `msys2_shell -conemu` 启动 shell 就足够了。 (3认同)