SANSUI'S BLOG

系统外观
分类标签
RSS
Sansui 2023
All rights reserved
人活着就是为了卡卡西

Windows 命令行相关配置之 msys2+zsh+zi

3 月 16 日, 2024

长久以来,遇到 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

参考

msys2-for-win

https://sdl.moe/post/zsh-conf/

更新于 2024-03-16 04:35