ConEmu:如何以 tab 形式调用 msys2?

ConEmu:如何以 tab 形式调用 msys2?

我想创建一个 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 控制台。

答案1

查看内部msys2_shell.bat以获取答案。此批处理运行 mintty 而不是 bash shell。没用。将第三行更改为 的完整路径bash.exe -l -i

当我启动 ConEmu 时,如何将此配置设置为默认配置

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

答案2

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

set CHERE_INVOKING=1 & set MSYSTEM=MINGW64 & "c:\msys64\usr\bin\bash.exe" --login -i

我个人建议设置 shell 来继承你的 PATH:

set CHERE_INVOKING=1 & set MSYSTEM=MINGW64 & set MSYS2_PATH_TYPE=inherit & "c:\msys64\usr\bin\bash.exe" --login -i

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

分解

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

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

  • MSYSTEM- 使用哪个 MSYS2 子系统。有三个:MSYS、MINGW32 和 MINGW64。子系统MSYS应该只用于pacman命令操作,因此我通常只在极少数需要时通过老式开始菜单图标调用它。 MINGW32对于少数用户来说,它对所有人来说都是无用的,您可能已经知道自己是谁了。

  • MSYS2_PATH_TYPEPATH- 如果未设置,MSYS 将使用仅包含 MSYS 二进制文件和几个选定的 Windows 系统路径的最小环境,并且是MSYSTEM=MSYSshell所需的模式仅有的。对于MINGWshell,建议使用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 通常相对于 进行安装根目录硬盘驱动器。请注意,%ConEmuDir%在引用 MSYS2 shell 时使用是有意义的适用于 Windows 的 Git, 因为相对于 安装%PROGRAMFILES%

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

关于msys2_shell.cmd

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

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

  • 终端- 这是一个窗口应用程序提供键盘/鼠标接口外壳程序在 Windows 中,它通常被称为控制台窗口。键盘命令通过管道传输到 shell 程序,输出以滚动条、彩色文本和其他有趣功能显示在窗口内。

在这种情况下,我希望我的终端康埃穆和我的壳BASH(mingw64).因此我想要康埃穆启动 shell 并仅有的壳。我不想康埃穆开始薄荷味。这两个都是终端,这会导致我们得到第二个弹出窗口——一个用于 ConEmu,一个用于 mintty。但这正是尝试运行msys2_shell.cmd将要做的事情。所以不要使用它。

答案3

我在让 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"
    
  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"
    
  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"
    

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

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

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

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

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

    "%ConEmuDir%\..\..\..\msys64\msys2_shell.cmd" -mingw64 -conemu -new_console:C:"%ConEmuDir%\..\..\..\msys64\mingw64.exe"
    
  2. {Shells::mingw-32}在 ConEmu 中为 MinGW32 shell创建一个具有名称和以下命令的新任务:

    "%ConEmuDir%\..\..\..\msys64\msys2_shell.cmd" -mingw32 -conemu -new_console:C:"%ConEmuDir%\..\..\..\msys64\mingw32.exe"
    
  3. {Shells::msys2-64}在 ConEmu 中为 MSYS2 shell创建一个具有名称和以下命令的新任务:

    "%ConEmuDir%\..\..\..\msys64\msys2_shell.cmd" -msys -conemu -new_console:C:"%ConEmuDir%\..\..\..\msys64\msys2.exe"
    

旨在msys2_shell.cmd直接从 中使用CMD.EXE,带有ConEmu64.exe/ConEmu.exe在 中PATH

msys2_shell -mingw64 -conemu

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

总结:我推荐第一种方法。以下是 ConEmu 中的截图作为证明:

在 ConEmu 中使用 MSYS2 MinGW64 shell

答案4

要在现有 ConEmu 实例中打开 MSYS2 Shell 选项卡,您可以使用以下设置配置任务:

  • 姓名:Bash::MSYS2 Bash
  • 任务参数:-dir C:\some-start-dir -icon C:\msys64\msys2.ico
  • 命令:C:\msys64\msys2_shell.cmd -defterm -no-start -shell bash -where C:\some-start-dir -new_console:m:""

这些选项-defterm-no-start可以防止在 ConEmu 之外打开单独的窗口。

该选项指示 ConEmu,当您将 Windows 路径复制/粘贴到终端窗口时,-new_console:m:""它不会在对话过程中自动将路径前缀为 Unix 样式。/mnt/

相关内容