Windows 命令行相关配置之 msys2+zsh+zi
长久以来,遇到 bash 脚本会临时切 git-bash 中的 bash。由于用的语言都有自己的包管理器,倒也一直够用。但是最近涉及到一些 c++,由 git-bash 提供的最小化环境东西缺得太多,几乎不能当个日常 shell 用,也没有 pacman 包管理,最后决定还是单独安装 msys2。
git-bash 和 msys2 同时安装不会冲突。msys2 是独立的 home 目录,而 git-bash 是与 windows 当前用户通用的。我本来想卸载 git-bash,但由于我现在还是用 powershell,最终发现 git-bash 不能卸载。一是 posh-git 只支持 git-bash 的 git;其次是,astro-nvim 中的一些插件需要 git.exe
在环境变量下,使用 alias 链接的 git 不行,而手动加环境变量会把 git 以外的程序也加进去,造成 msys2 的工具与 powershell 本身工具的冲突。
想来想去,决定保留 git-bash 到最小化的状态,当成 powershell 的插件用。unix-like shell 以及相应的包管理还是 msys2。
安装 msys2
见 https://www.msys2.org/ 。安装过程没什么好说的,唯一要注意的在于安装目录的权限必须是当前用户可以完全控制,否则后续各种包的安装都会有一大堆问题。如果因为强迫症安装到 Program Files 下,则需要手动添加当前用户的权限。
软链接问题
windows 的软链接本来也是个很麻烦的问题。到 msys2 下,还多了一个软链接方式兼容问题。msys2 默认是 ln -s
是复制,要用 windows 风格的软链接,可以改安装目录下的各种 .ini
文件中的配置。
MSYS="winsymlinks:lnk"
zsh + zi
zsh 的安装
pacman -S zsh
老实说个人觉得和 linux 上的 zsh 相比还是差了一大截,用起来和 bash 感觉差不多。只是 zsh 插件管理的选择比较多
zi 的安装
关于 zsh 插件管理,之前在 git-bash 上我也安装了 oh-my-zsh,但是环境原因,遇到的 bug 着实太多,基本不用。另外,最大的问题是启动太慢,每次启动长达 10 秒。我分析了一下初始化脚本的执行时长,发现拖慢速度的罪魁祸首是初始化命令补全(就不能异步吗啊!)当然用 mac 时 omz 也有点慢,但显然没有 msys2 里这么离谱。
下午吐槽这个事情后,Antarx 说他换 zi 了。我试了下,确实很快,从没超过3s,令人偷税。
安装过程最好在 msys2 的 GUI 终端下进行,因为需要登录的默认目录是在 home 的当前用户下。但这里又有另一个问题 —— msys2 不带 git。如果系统有另外安装 git,想复用,可以 cmd 启动 zsh,不指定启动的目录,指定继承环境变量。
C:\\msys64\\msys2_shell.cmd -defterm -no-start -mingw64 -use-full-path -shell zsh
zi 的配置与插件
安装Wiki 在不断更新,检查最新版的安装方法。
安装好后,.zshrc
里添加如下,写好重启 zsh 即可。
$ vi ~/.zshrc
# zsh
setopt AUTO_PUSHD
export CLICOLOR=1
export LSCOLORS=ExGxFxdaCxDaDahbadeche
zstyle ':completion:*' list-colors "${(@s.:.)LS_COLORS}"
alias ls='ls --color=auto'
alias la='la --color=auto'
# zi
typeset -A ZI
ZI[BIN_DIR]="${HOME}/.zi/bin"
source "${ZI[BIN_DIR]}/zi.zsh"
autoload -Uz _zi
(( ${+_comps} )) && _comps[zi]=_zi
# source <(curl -sL init.zshell.dev); zzinit
# 插件
# 提前运行一次 zi ice pick"async.zsh" src"pure.zsh"
zi light sindresorhus/pure
zi light agkozak/zsh-z # 不能用 eval "$(zoxide init zsh)" 会冲突
zi snippet OMZP::git
zi light zsh-users/zsh-completions
# 提前运行一次 zi ice wait lucid atload'_zsh_autosuggest_start'
zi light zsh-users/zsh-autosuggestions
# 提前运行一次 zi ice wait lucid atinit='zpcompinit'
zi light zdharma/fast-syntax-highlighting
Windows Terminal 设置
在设置里改 json,加相应的 profile。可以使用 -use-full-path
继承 windows 系统的环境变量。
{
"commandline": "C:\\msys64\\msys2_shell.cmd -defterm -here -no-start -mingw64 -use-full-path -shell zsh",
"guid": "{c420e0af-28d9-4742-a6b8-83d5fcf424e9}",
"icon": "C:\\msys64\\mingw64.ico",
"name": "msys2 zsh",
"startingDirectory": "%USERPROFILE%"
}
Vscode Terminal 设置
"terminal.integrated.profiles.windows": {
"MSYS2 zsh": {
"path": "C:\\msys64\\msys2_shell.cmd",
"args": ["-defterm","-here","-no-start","-mingw64","-use-full-path","-shell","zsh"],
"env": { "MSYSTEM": "MINGW64" },
"overrideName": true
},
},
Mintty 设置
Mintty 是 msys2 里默认的终端 GUI,默认 shell 是 bash。修改 mingw64.ini
为如下内容。
MSYS=winsymlinks:lnk
MSYS2_PATH_TYPE=inherit
MSYSTEM=MINGW64
SHELL=/usr/bin/zsh
npm设置
如果有使用 npm 进行包管理,继承自环境变量的 npm 补全时会报错。需要设置为
$ npm config edit
script-shell=C:\msys64\usr\bin\bash.exe
shell=C:\msys64\msys2\usr\bin\bash.exe # 重要
$ npm config list
conda 设置
如果有使用 conda 进行 python 开发,继承自环境变量的 conda 默认初始化脚本也有问题……从 Github 上查到的解决方法……
# >>> conda initialize >>>
# !! Contents within this block are managed by 'conda init' !!
if [ -f '/c/Users/me/miniconda3/Scripts/conda.exe' ]; then
#eval "$('/c/Users/me/miniconda3/Scripts/conda.exe' 'shell.zsh' 'hook')"
eval "$('/c/Users/me/miniconda3/Scripts/conda.exe' 'shell.zsh' 'hook' | sed -e 's/"$CONDA_EXE" $_CE_M $_CE_CONDA "$@"/"$CONDA_EXE" $_CE_M $_CE_CONDA "$@" | tr -d \x27\\r\x27/g')"
fi
# <<< conda initialize <<<
ssh配置共用
如果有多个 ssh 账户的密钥,最好是软链接一下配置目录。注意需要前面的修改软链接方式,否则还是去资源管理器手动软链接吧。
ln -s /c/Users/me/.ssh ~/.ssh