SANSUI'S BLOG

系统外观
分类标签
RSS
Sansui 2023
All rights reserved
人活着就是为了卡卡西
2024 年 3 月 16 日

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 的当前用户下。如果使用 windows terminal,要手动设置启动的目录,否则 plugins 目录软链接时会直接报找不到源目录。

zi 的配置与插件

.zshrc 里添加如下,写好重启 zsh 即可。

$ vi ~/.zshrc

# zsh
setopt AUTO_PUSHD

export CLICOLOR=1
export LSCOLORS=ExGxFxdaCxDaDahbadeche
zstyle ':completion:*' list-colors "${(@s.:.)LS_COLORS}"

# 安装或启动 zi,由于墙的关系,可以把启动脚本下下来,替换为本地文件
source ~/.zi.zsh; zzinit
# source <(curl -sL init.zshell.dev); zzinit


# 插件

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

zi light agkozak/zsh-z  # 不能用 eval "$(zoxide init zsh)" 会冲突
zi snippet OMZP::git
zi light zsh-users/zsh-completions

autoload -Uz compinit; compinit
zinit cdreplay -q

zstyle ':completion:*' list-colors "${(@s.:.)LS_COLORS}"
autoload -Uz compinit
compinit

## theme - pure
# install: `zi ice pick"async.zsh" src"pure.zsh"``
zi light sindresorhus/pure


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

参考

msys2-for-win

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

更新于 2024-03-16 04:35
Waline