通过对 MSYS2 的一顿操作,可以获得在 Windows 下比较畅快的 Linux 工具的体验,体验到 Vim、Tmux、zsh、Git、MinGW-w64 等优秀的工具:

Windows 下的桌面端程序丰富,但是对于一个程序猿来说,在某些犄角旮旯的需求场景下用 Linux 的命令行工具解决可能比 Windows 下 GUI 的鼠标点击来的更快,在熟悉了 Linux 命令行之后更加是离不开。某些 Windows 下的收费程序(如 XShell)还能在 Linux 下找到跟好且开源的替代品(OpenSSH);而有些 Linux 下命令行工具(如 tmux)的极致体验在 Windows 下就很难得了。还好有 MSYS2 的存在,解决了 Windows 下 tmux、ssh、compiler 等众多命令行的痛点。WSL(Windows Subsystem for Linux) 结合 mintty 应该也能满足需求,有机会的话另做文章。
在进行操作之前有必要了解下下面的几个容易混淆的名称和概念:
以上的内容都可以在 Git-Credential-Manager-for-Windows( github /Microsoft/Git-Credential-Manager-for-Windows/issues/500) 中大佬的讨论里看到。
win 下的 MSYS2 和 Cygwin 都是使用的 mintty,也可以使用 cmder 或者 ConEmu 连接,但是在 ConEmu 和 cmder 下使用 tmux 体验有问题,所以还是建议使用 mintty 为好。
mintty 的使用的 Tips( github /mintty/mintty/wiki/Tips) ,可以自行研究下。
不过就使用来说了解下面的几个快捷键就可:
可以在 这里( github /hsab/WSL-config/tree/master/mintty/themes) 找到很多主题,下面给出了一个基于 onedark 主题和 DejaVu( github /ryanoasis/nerd-fonts) 字体(支持 Powerline) 的配置,修改 ~/.minttyrc 为下面的内容之后重新打开 mintty 即可:
Font=DejaVuSansMono NF
Transparency=low
FontHeight=10
Term=xterm-256color
Columns=110
Rows=35
Scrollbar=none
AllowBlinking=yes
CursorType=block
ForegroundColour=171,178,191
BackgroundColour=30,33,39
CursorColour=97,175,239
BoldBlack=92,99,112
Black=92,99,112
BoldRed=224,108,117
Red=224,108,117
BoldGreen=152,195,121
Green=152,195,121
BoldYellow=209,154,102
Yellow=209,154,102
BoldBlue=97,175,239
Blue=97,175,239
BoldMagenta=198,120,221
Magenta=198,120,221
BoldCyan=86,182,194
Cyan=86,182,194
BoldWhite=171,178,191
White=171,178,191
BoldAsFont=yes
其他的配置也可以通过右键 mintty 窗口标题栏的 option 进行修改,也可以将主题文件保存到 msys64/usr/share/mintty/themes 目录下,这样在 option 里就可以修改了。vim 下光标不是块的问题参考 block-cursor( superuser /questions/634326/how-can-i-get-a-block-cursor-in-vim-in-the-cygwin-terminal) ,暂时没有好的解决方法。
这一部分自己可以探索,在使用 tmux + zsh 之后其实可以放弃这两个软件了,除非有使用 cmd 和 powershell 的需求。
在正式进入 MSYS2 的使用之间,可以先聊聊 Windows 下大家都会安装的工具 Git for Windows,一个基于 MSYS2 的 Git。下载安装就不在赘述,我的习惯一般是只将 git bash here 勾选上。
使用 Git bash 时候从窗口标题栏可以看出这是个基于 MinGW-w64 的项目,利用 Git 的源码 和 MinGW-w64 工具链编译的基于 windows 下的 git,为了提高使用幸福感 Git bash 的 shell 使用的是 MSYS2(安装目录下的 usr/bin/mintty ),当然将 git.exe 所在目录加在 windows 下的环境变量里之后在 cmd 和 powershell 下也是可以使用 git 命令的,但是其体验不及 git bash(如无:GCM)。
由于使用了 MSYS2,那么同时也会提供一些附属的命令,查看 git 安装目录下的 usr/bin 即可知道有哪些。
改进 Git bash 体验 ,如果不想安装 MSYS2 但又想改进 git bash 的使用姿势,可以参照下面的步骤:
git for windows 是基于 MSYS2 和 MinGW 的一个项目,但是是基于修改过的 msys2-runtime,查看 gfw wiki( github /git-for-windows/git/wiki) 可能会了解更多。如果仅仅是轻度的命令行依赖,在安装 tmux 之后,git bash 应该就能够满足需求,但如果诉求更多的话,那么就要考虑 MSYS2 了。
下面进入正题,完全使用 MSYS2 可以在其上安装 git,MinGW-w64,OpenSSH,CMake 还有其他工具等,免得使用 git 装一个、使用 MinGW-w64 又装一个,这所以的功能其实都可以由 MSYS2 配合 pacman 来完成,OpenSSH + tmux 连什么 XShell 工具都可以省略掉了。
关于 msysgit 和 git for windows 的区别?在 msysgit( github /msysgit/msysgit) 可以看到。
$ pacman -Sy
$ pacman -Su包管理 pacman 有下列常用的参数
安装完 MSYS2 之后,开始菜单中会发现三个快捷方式: MSYS2 MinGW 32-bit 、 MSYS2 MinGW 64-bit 、 MSYS2 MSYS ,右键快捷方式发现其执行都是 msys2_shell.cmd 文件,只是附件的参数不同如 -mingw32 , -mingw64 , -msys
查看 msys2_shell.cmd 文件会发现传进来的参数会影响环境变量 MSYSTEM 的配置:
if "x%~1" == "x-msys" shift& set MSYSTEM=MSYS& goto :checkparams
if "x%~1" == "x-msys2" shift& set MSYSTEM=MSYS& goto :checkparams
if "x%~1" == "x-mingw32" shift& set MSYSTEM=MINGW32& goto :checkparams
if "x%~1" == "x-mingw64" shift& set MSYSTEM=MINGW64& goto :checkparams
当然还可以使用其他的一些参数,让其设定为环境变量传递给 MSYS2 设置其特性。
也就是这三个的不同点也就是一个环境变量的不同,而这个环境变量最终会影响 PATH 的调用顺序,也就是 mingw32 优先使用 mingw32 下的工具,mingw64_shell.bat 优先使用 mingw64 下的工具,而 msys2 两个都不使用,只用自身 msys 的工具 (usr bin)。这么做的好处是当需要编译 32bit Target 的项目时使用 mingw32,64 bit 使用 mingw64,各套工具互不干扰。
在上面的改造之中也提及了开启 MSYS2 终端时候传递的环境变量配置,这些配置会影响最终的 SHELL 效果,可以在 *.ini 里配置相应 *.exe 的启动参数,也可以通过快捷方式传递给 msys2_shell.cmd :
部分环境变量最终起作用的原理在于 /etc/profile 脚本,可以自行实践。
将 zsh 集成到 VSCode 的内置终端非常简单,一下是我的参考配置:
// 新 shell 尝试
"terminal.integrated.shell.windows": "C:\\Application\\msys64\\usr\\bin\\zsh.exe",
"terminal.integrated.shellArgs.windows": [
"--login",
],
"terminal.integrated.env.windows": {
"CHERE_INVOKING": "1",
"MSYSTEM": "MINGW64",
"MSYS2_PATH_TYPE": "inherit",
"VSCODE": "1"
},
"terminal.integrated.cursorStyle": "line",
"terminal.integrated.fontFamily": "DejaVuSansMono NF",
需要说明的是 terminal.integrated.env.windows 项,这里的配置可以根据个人需要设置,值得注意的是 VSCODE 环境变量是我自己定义的,原因是在 VSCode 终端内使用默认的 robbyrussell 主题,由于提示符其提示符箭头的问题,终端内光标会不正常,问题见 a space between cursor and words( github /Maximus5/ConEmu/issues/1106) ,我这里的解决方式是,复制修改一份 robbyrussell 的主题,将箭头换成 > 符号,然后在 ~/.zshrc 里加以判断:
if [[ -z "${VSCODE}" ]]; then
ZSH_THEME="robbyrussell"
else
ZSH_THEME="robbyrussell_fix"
fi
这样在 VSCode 里将环境变量 VSCODE 传入即可激活修改过的主题,当然如果你使用的主题没有问题就不需要这样做了。还有就是同 cmder/ConEmu 一样,在 VSCode 的集成终端内无法使用 tmux。
修复 mintty 的使用 win 的 python 终端问题 ,这是因为因为宿主机上的 python 使用的是 native Windows API for command-line user interaction ,也就是涉及到 win 下的关于终端输入的命令在 msys2 下都会无法进入,还好有解决方法。
安装 pacman -S winpty 作为 mintty 代理,处理 python 之外其他有问题的也可使用如 nodejs、MySQL 等。之后就可以使用如 winpty python 来使用,也可以全局使用 winpty 去 wraper,但是会使得 tmux 无法使用。所以最好的方式在 bashrc/zshrc 里添加 alias 即可:
alias mysql="winpty mysql"
alias node="winpty node"
alias python="winpty python"
alias ipython="winpty ipython"
alias psql="winpty psql"
alias redis-cli="winpty redis-cli"
另外在 msys2 下要想使用 python 虚拟环境,就得使用 source venv/Scripts/activate 的形式了。
watch 命令缺失 ,该命令需要单独安装: pacman -S procps-ng ,同理一些其他的命令行的缺失可以在搜索引擎里以 MSYS2 xxx 的形式得到解答。下面列出常用的包:
vim
git
tmux
tree
zsh
rsync
winpty
procps-ng
inetutils
curl
openbsd-netcat
