zinit 配置 zsh

先前就已经在 wsl 中配置了 zsh 以及 oh-my-zsh ,但是插件过多导致启动速度非常之慢,在搜索中发现了一个解决方案,即使用 zinit 代替 oh-my-zsh 。

起因

wsl 借助 anaconda 配置 volatility 这篇文章中我就提到过自己已经配置过 zsh,当初是因为看了鹤翔万里的视频 选择了一个个人感觉比较好用的终端,搭配上 oh-my-zsh[1],安装了一些插件后,个人手感还挺不错的,就放着没管了。但最近突发奇想又开始捣鼓 wsl 之后发现启动实在太慢,粘贴甚至也是一个字母一个字母的贴进去的,手感实在太差,于是就在网上搜索提速的方案。于是便找到了本次的主角 zinit[2]

“冷门”但强大的插件管理器

zinit 的中文资料相较于 oh-my-zsh 确实少了很多,github 上的 star 数目相比之下也不多,以致我一开始并没有清楚理解 zinit 的正确使用方式,直到查阅了这篇 blog[3],我才明白它某种意义上是与 oh-my-zsh 处于并列层级的。而它最大的优点就是可以实现异步加载插件,可以实现 zsh 已经打开但部分插件在后台加载,或是在特定条件下加载,这样就可以大大提高 zsh 的启动速度。而且,它也支持 oh-my-zsh 的插件,所以我可以继续沿用习惯的插件。

安装配置

zsh 的安装便不再赘述。首先是安装 zinit。因为绝大部分的中文引导都写作于三四年前,安装方式与现在有所不同,所以我直接参考了 repo,官方给出了自动和手动两种方式,我选择了自动安装。

1
bash -c "$(curl --fail --show-error --silent --location https://raw.githubusercontent.com/zdharma-continuum/zinit/HEAD/scripts/install.sh)"

执行这一命令后,zinit 会安装在 ~/.local/share/zinit/zinit.git,并且会更新 .zshrc 文件,使得我们可以在 zsh 中使用 zinit 命令。

不过在安装和重启 zsh 后,我们需要执行 zinit self-update 来更新 zinit。

手动安装则需要在 .zshrc 文件中添加如下内容:

1
2
3
4
ZINIT_HOME="${XDG_DATA_HOME:-${HOME}/.local/share}/zinit/zinit.git"
[ ! -d $ZINIT_HOME ] && mkdir -p "$(dirname $ZINIT_HOME)"
[ ! -d $ZINIT_HOME/.git ] && git clone https://github.com/zdharma-continuum/zinit.git "$ZINIT_HOME"
source "${ZINIT_HOME}/zinit.zsh"

并且注意,如果你选择在 compinit 后执行 source $ZINIT_HOME/zinit.zsh,那么你需要在这之后额外添加如下内容

1
2
autoload -Uz _zinit
(( ${+_comps} )) && _comps[zinit]=_zinit

这之后退出 zsh 便可以安装 zinit 了。

手动安装的好处是可以自定义安装路径,但是目前而言我觉得自动安装已经足够了,虽然我总得有一天去收拾 dotfiles。

插件安装

zinit 的插件管理实际上是从对应 url 获取插件内容,下载下来后自行编译的,而这获取内容的方式有很多种,但试验了一部分发现以前的一些示例已经存在问题了,所以我只介绍我使用的方式。

从 GitHub repo 加载插件

1
2
zinit load  <repo/plugin> # Load with reporting/investigating.
zinit light <repo/plugin> # Load without reporting/investigating.

load 方式支持后续在终端中查看插件的加载情况,方法为 zinit report,而 light 方式则不支持。不过相应地,light 方式加载插件的速度会更快一些。但开启 Turbo 模式后,这点差异可以忽略不计。

从 oh-my-zsh 加载插件

这里使用的是 zinit snippet 命令,它可以加载代码片段来实现插件安装。而 oh-my-zsh 因为太过常用,所以 zinit 提供了相应的缩写。

1
2
3
4
5
zinit snippet <URL>        # Raw Syntax with URL
zinit snippet OMZ::<PATH> # Shorthand OMZ/ (https://github.com/ohmyzsh/ohmyzsh/raw/master/)
zinit snippet OMZL::<PATH> # Shorthand OMZ/lib/
zinit snippet OMZT::<PATH> # Shorthand OMZ/themes/
zinit snippet OMZP::<PATH> # Shorthand OMZ/plugins/

Ice 修饰词

命令 zinit ice 为下一条命令提供了 Ice 修饰词,简而言之就是下一条命令的可选参数。

2024.1.8 Github 取消了对于 Subversion 的支持,svn 修饰词的可用性下降许多。Sunsetting Subversion support

我使用的修饰词有如下三个:

  1. depth: 将 --depth 参数传递给 git,即限制下载的历史记录量。但是不适用于 snippets

  2. wait: 推迟插件加载时间,后接数字,单位为秒。单独使用 wait 默认为 wait '0'

  3. lucid: 跳过 wait 修饰词的 Loaded ... 消息。

配置示例

大部分都是抄的 Aloxaf 大佬的 blog,他写的 fzf-tab[4] 插件也十分的好用。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
# load powerlevel10k theme
zinit ice depth=1; zinit light romkatv/powerlevel10k

# fast cd
zinit ice lucid wait='1'
zinit light skywind3000/z.lua

zinit light Aloxaf/fzf-tab
zinit light zsh-users/zsh-completions
zinit light zsh-users/zsh-autosuggestions
zinit light zdharma/fast-syntax-highlighting

# load oh-my-zsh framework and some plugins
zinit snippet OMZ::lib/git.zsh
zinit snippet OMZ::lib/history.zsh
zinit snippet OMZ::lib/key-bindings.zsh
zinit snippet OMZ::lib/clipboard.zsh
zinit snippet OMZ::lib/completion.zsh
zinit snippet OMZ::lib/theme-and-appearance.zsh

zinit snippet OMZP::colored-man-pages
zinit snippet OMZP::command-not-found
zinit snippet OMZP::conda
zinit snippet OMZP::cp
zinit snippet OMZP::extract
zinit snippet OMZP::gitignore

zinit snippet OMZ::plugins/sudo/sudo.plugin.zsh
zinit snippet OMZ::plugins/colored-man-pages/colored-man-pages.plugin.zsh

# kill preview
zstyle ':completion:*:*:*:*:processes' command "ps -u $USER -o pid,user,comm,cmd -w -w"
zstyle ':fzf-tab:complete:kill:argument-rest' fzf-preview 'ps --pid=$word -o cmd --no-headers -w -w'
zstyle ':fzf-tab:complete:kill:argument-rest' fzf-flags '--preview-window=down:3:wrap'

# cd preview
zstyle ':fzf-tab:complete:cd:*' fzf-preview 'exa -1 --color=always $realpath'

参考


zinit 配置 zsh
https://shadowash0215.github.io/2024/02/20/misc-3/
Author
shad0wash
Posted on
February 20, 2024
Licensed under