安装
自动安装
官方推荐的安装方式,一键完成。不过让我很没有安全感,我倾向于手动安装。
sh -c "$(curl -fsSL https://raw.githubusercontent.com/zdharma/zinit/master/doc/install.sh)"
手动安装
首先 clone repo 到随便哪个位置
git clone https://github.com/zdharma/zinit.git ~/.zinit/bin
然后在你的 ~/.zshrc 顶端添加如下语句
source ~/.zinit/bin/zinit.zsh
安装完成,非常简单。
配置
从 GitHub repo 加载插件
最为常见的加载方式,和其他插件管理器的用法是一致的,直接 zinit light {用户名}/{repo名}
即可。
zinit light zsh-users/zsh-autosuggestions
zinit light zdharma/fast-syntax-highlighting
# PS. zinit 和 fast-syntax-highlighting 是同一个作者,这位作者对速度的追求确实让人钦佩
加载 oh my zsh 插件
OMZ 别的不说,插件是真的多,如果不能加载 OMZ 插件那就太遗憾了。因此像 antigen 这样的插件管理器甚至直接提供了整合 OMZ 框架的能力。
zinit 并没有直接整合 OMZ,不过提供了更为强大的 snippet
命令来加载单独的插件。
单文件插件
snippet
命令可以接 URI 来直接加载单个文件。比如加载 OMZ 的 sudo 插件:
zinit snippet OMZ::plugins/sudo/sudo.plugin.zsh
后面那部分看起来好像不像一个 URI?因为 OMZ 实在太常用了,因此可以用 OMZ::
来代替它的 repo 地址(对于 Prezto 则是 PZT::
),上面的写法其实等价于:
zinit snippet https://github.com/ohmyzsh/ohmyzsh/blob/master/plugins/sudo/sudo.plugin.zsh
多文件插件
有时候,插件目录里不止一个文件(比如包含插件+补全),这时就需要使用 svn
修饰词来加载了:
zinit ice svn
zinit snippet OMZ::plugins/extract
这里不详细解释什么叫修饰词了,你可以理解成一种实现可选参数的手段,修饰词只对接下来的一条命令起效。 格式是 zinit ice {修饰词1} {修饰词2} ...
svn
修饰词,表示下一行的 URI 需要使用 SVN 协议加载。此时 zinit 会使用 SVN 协议下载整个目录,自动识别并加载需要的文件。
加载补全
补全文件,有两种加载方式:1. 使用 svn
修饰词直接加载目录,zinit 会自动识别并加载补全。 2. 直接加载补全文件,此时需要使用 as="completion"
这个修饰词,它会让 zinit 将下一行命令加载的文件作为补全安装到指定目录:
zinit ice as="completion"
zinit snippet OMZ::plugins/cargo/_cargo
加载 OMZ 插件时需要注意的点
OMZ 的部分插件/主题会依赖 OMZ 本身提供的功能。比如 git 插件,如果想要正常使用的话,需要加载 OMZ 的 git 库。
# 加载 OMZ 的 git 库
zinit snippet OMZ::lib/git.zsh
# 加载 OMZ 的 git 插件
zinit snippet OMZ::plugins/git/git.plugin.zsh
也就是说,虽然 zinit 并没有提供直接加载 OMZ 框架的能力,但是你可以使用 snippet 功能选择性加载框架的部分功能。这比其他插件管理器的做法更为灵活。
比如我的配置里就直接加载了 OMZ 的部分库,如果你也是 OMZ 的用户,建议同样加载这些库,能保证体验一致。(比如键位绑定)
zinit snippet OMZ::lib/clipboard.zsh
zinit snippet OMZ::lib/completion.zsh
zinit snippet OMZ::lib/history.zsh
zinit snippet OMZ::lib/key-bindings.zsh
zinit snippet OMZ::lib/git.zsh
zinit snippet OMZ::lib/theme-and-appearance.zsh
Turbo Mode
终于说到 zinit 的最强 feature 了。没有 Turbo Mode 的 zinit 不过是略为优秀的插件管理器。然而有了 Turbo Mode,zinit 可以说是顶级 zsh 插件管理器,没有之一!
这个功能非常强大,基本用法却很简单。举例来说,下面的代码,就实现了 OMZ git 插件的延迟加载。
zinit ice lucid wait='0'
zinit snippet OMZ::plugins/git/git.plugin.zsh
延迟加载用到了两个修饰词:lucid
,用于静默加载。wait={秒}
,在 prompt 加载完毕后的若干秒后再加载。上面的例子就是让 prompt 启动后立刻加载 git 插件。
如果坚持追求极致速度的话,可以参考:zplugin_tutorial/#turbo-mode-加载复杂的命令提示符。
安装一些下面用到的插件
安装lua
yum -y install libtermcap-devel gc ncurses-devel libevent-devel readline-devel gc lua.x86_64
安装unzip
yum install -y unzip.x86_64
安装svn
yum install -y subversion
安装exa
安装make
dnf group install "Development Tools"
dnf -y install glibc.x86_64
yum install -y gcc pcre pcre-devel zlib zlib-devel openssl openssl-devel make.x86_64 cmake.x86_64 autoconf.noarch
安装exa
# 下载对应二进制版本并解压安装到指定目录
cd /usr/local/src
wget https://github.com/ogham/exa/releases/download/v0.9.0/exa-linux-x86_64-0.9.0.zip
unzip exa-linux-x86_64-0.9.0.zip
mv exa-linux-x86_64 /usr/local/bin/exa
# 下载并安装对应的 MAN 手册
wget https://raw.githubusercontent.com/ogham/exa/master/contrib/man/exa.1
mv exa.1 /usr/share/man/man1
zinit常用命令:
# 加载插件
$ zinit load {plg-spec}
# 加载插件,不打印加载信息
$ zinit light [-b] {plg-spec}
# 加载单文件,-f 表示不使用缓存,即强制重新下载
$ zinit snippet [-f] {url}
# 卸载插件,-q 表示 quiet
$ zinit unload [-q] {plg-spec}
# 显示插件加载时间,以插件加载顺序排序。-s 表示以秒进行显示(默认毫秒),-m 表示显示插件加载时刻
$ zinit times [-s] [-m]
# 显示 Zinit 状态
$ zinit zstatus
# 显示插件加载状态,--all 表示显示所有插件
$ zinit report {plg-spec} | --all
# 显示已加载的插件(使用关键字进行过滤)
$ zinit loaded [keyword],list [keyword]
# 显示每个插件的设置的按键绑定
$ zinit bindkeys
# 编译插件
$ zinit compile {plg-spec} | --all
# 移除已编译的插件
$ zinit uncompile {plg-spec} | --all
# 显示已编译的插件
$ zinit compiled
# 更新 Zinit
$ zinit self-update
# 更新插件/脚本,--all 表示更新所有插件/脚本,-q 表示静默更新,-r | --reset 更新前执行 git reset --hard / svn revert
$ zinit update [-q] [-r] {plg-spec} | URL | --all
# 为下一条 zinit 命令添加 ice 描述符
$ zinit ice <ice specification>
# 磁盘删除插件/脚本,--all 表示清除,--clean 表示删除未加载的插件/脚本
$ zinit delete {plg-spec} | URL | --clean | --all
# 进入插件目录
$ zinit cd {plg-spec}
zinit 管理
- zinit 升级
zinit self-update
- 升级其他插件
zinit update
- 清理没有加载的插件
zinit delete --clean
我的zsh配置
# Enable Powerlevel10k instant prompt. Should stay close to the top of ~/.zshrc.
# Initialization code that may require console input (password prompts, [y/n]
# confirmations, etc.) must go above this block; everything else may go below.
if [[ -r "${XDG_CACHE_HOME:-$HOME/.cache}/p10k-instant-prompt-${(%):-%n}.zsh" ]]; then
source "${XDG_CACHE_HOME:-$HOME/.cache}/p10k-instant-prompt-${(%):-%n}.zsh"
fi
# 历史命令日期显示格式
HIST_STAMPS="yyyy-mm-dd"
# 补全快捷键重设
bindkey ',' autosuggest-accept
# source your own zsh file if exists
[ -f ~/.zsh.sh ] && source ~/.zsh.sh
# source your own shrc file if exists
[ -f ~/.env.sh ] && source ~/.env.sh
# source your own alias file if exists
[ -f ~/.alias.sh ] && source ~/.alias.sh
# source your own function file if exists
[ -f ~/.fun.sh ] && source ~/.fun.sh
# source your proxy shrc file if exists
[ -f ~/.proxy.sh ] && source ~/.proxy.sh
# To customize prompt, run `p10k configure` or edit ~/.p10k.zsh.
[[ ! -f ~/.p10k.zsh ]] || source ~/.p10k.zsh
# 下面都是zinit配置
source ~/.zinit/bin/zinit.zsh
# 加载 powerlevel10k 主题
zinit ice depth=1; zinit light romkatv/powerlevel10k
# fzf文本增强工具
zinit ice from"gh-r" as"program"
zinit load junegunn/fzf-bin
zinit light Aloxaf/fzf-tab
# 快速目录跳转
zinit ice lucid wait='1'
zinit light skywind3000/z.lua
zinit light zsh-users/zsh-completions
zinit light zsh-users/zsh-autosuggestions
zinit light zdharma/fast-syntax-highlighting
# zinit light zsh-users/zsh-syntax-highlighting
# 加载 OMZ 框架及部分插件
zinit snippet OMZ::lib/clipboard.zsh
zinit snippet OMZ::lib/completion.zsh
zinit snippet OMZ::lib/history.zsh
zinit snippet OMZ::lib/key-bindings.zsh
zinit snippet OMZ::lib/git.zsh
zinit snippet OMZ::lib/theme-and-appearance.zsh
zinit snippet OMZ::plugins/colored-man-pages/colored-man-pages.plugin.zsh
zinit snippet OMZ::plugins/sudo/sudo.plugin.zsh
zinit ice svn
zinit snippet OMZ::plugins/extract
zinit ice lucid wait='1'
zinit snippet OMZ::plugins/git/git.plugin.zsh
# ---- (可选)加载了一堆二进制程序 ----
zinit light zinit-zsh/z-a-bin-gem-node
zinit as="null" wait="1" lucid from="gh-r" for
mv="exa* -> exa" sbin ogham/exa
mv="*/rg -> rg" sbin BurntSushi/ripgrep
mv="fd* -> fd" sbin="fd/fd" @sharkdp/fd
sbin="fzf" junegunn/fzf-bin
# 加载它们的补全等
zinit ice mv="*.zsh -> _fzf" as="completion"
zinit snippet 'https://github.com/junegunn/fzf/blob/master/shell/completion.zsh'
zinit snippet 'https://github.com/junegunn/fzf/blob/master/shell/key-bindings.zsh'
zinit ice as="completion"
zinit snippet 'https://github.com/robbyrussell/oh-my-zsh/blob/master/plugins/fd/_fd'
zinit ice mv="*.zsh -> _exa" as="completion"
zinit snippet 'https://github.com/ogham/exa/tree/master/completions/completions.zsh'
# 不需要花里胡哨的 ls,我们有更花里胡哨的 exa
DISABLE_LS_COLORS=true
alias ls=exa
# 配置 fzf 使用 fd
export FZF_DEFAULT_COMMAND='fd --type f'
# ---- 加载完了 ----
参考:
我就感觉到快 —— zsh 和 oh my zsh 冷启动速度优化
加速你的 zsh —— 最强 zsh 插件管理器 zplugin/zinit 教程