ZSH 插件管理器 zinit 介绍及使用

2021-07-16 877点热度 0条评论

如果你是一名 Linux/Unix 用户,偏爱命令和脚本,我想你对 Shell 肯定不陌生。

最常用的 Shell 肯定是 bash,这几乎是每个 Linux 发行版的默认 Shell,并且绝大多数 Shell 脚本都是基于 Bash 编写的。

不过一些有追求的用户可能会选择其他 Shell 作为交互式 Shell,比如 zsh, ksh, fish 等,这些 Shell 拥有 Bash 大多数功能以及兼容性,并且增加了扩展性,使 Shell 更加的易用。

小山自己比较喜欢 zsh,因为它有丰富的插件生态,这些插件能让我使用 zsh 时更高效。zsh 还有很多主题,相比于自定义程度较低的 bash 来说,zsh 的主题可以说是五花八门了。

如果你使用过 zsh,想必一定对 Oh My Zsh 不陌生,很多人也是从它开始接触 zsh 的。这是一个 zsh 插件框架,包含了很多插件和主题,以及实用设置。但是有些人可能会觉得它太臃肿了,不够自由,想要个更自由的 zsh,但是又不想失去插件管理能力。

这时的最佳选择就是插件管理器,插件管理器可以帮助你加载/管理插件,并且在你需要的时候升级它们,最重要的是插件管理器只负责管理插件,并不会修改其他设置。

小山之前用的插件管理器是 Antigen,但是它好久没更新了,而且比较依赖于 Oh My Zsh,所以我就打算换一个插件管理器。体验了好几个,最终选择了 zinit,它目前处于比较活跃的状态,并且提供了更多的功能。

Zsh ZINIT

下面我会简单介绍一下 zinit 的用法,帮助大家更快的上手。

以下操作以 Linux 系统为例,并且假设你已经熟悉 Shell 的基本操作和语法。如果你已安装其它 zsh 插件框架/管理器,务必禁用它们。

安装命令:sh -c "$(curl -fsSL https://git.io/zinit-install)"

执行上述安装命令最后会询问你是否需要额外的 zinit 插件,输入 N 即可。

上述安装命令默认将 zinit 安装至~/.local/share/zinit/zinit.git,并且会自动在~/.zshrc添加 zinit 初始化命令。如果你需要安装至其他目录,在执行安装命令前导出ZINIT_HOME变量。

接下来所有命令如果没有特殊说明,则全部在~/.zshrc的 zinit 初始化命令 (source ~/.zinit/bin/zinit.zsh) 之后进行改动。

安装好之后可以重新打开终端,执行zinit zstatus测试 zinit 是否正常。

如果正常,就可以在~/.zshrc添加命令让 zinit 加载插件了。

先介绍下 zinit 常用的三个加载插件的命令:

zinit snippet: 加载单个脚本,相当于source命令,不过可以由 zinit 进行管理。

zinit load: 加载整个存储库或单个脚本,如果不明确指定 URL,默认是使用 git 从 GitHub 加载存储库。比如:zinit load example/plugin,这个默认命令会从 https://github.com/example/plugin 加载插件。

zinit light: load 命令的轻量版本,推荐优先使用这个命令加载插件。

此外,对于 Oh My Zsh 和 Prezto 插件框架的单个插件加载,zinit 提供了简写形式。

OMZ: https://github.com/ohmyzsh/ohmyzsh

OMZL: https://github.com/ohmyzsh/ohmyzsh/tree/master/lib

OMZP: https://github.com/ohmyzsh/ohmyzsh/tree/master/plugins

OMZT: https://github.com/ohmyzsh/ohmyzsh/tree/master/themes

PZT: https://github.com/sorin-ionescu/prezto

PZTM: https://github.com/sorin-ionescu/prezto/tree/master/modules

以上命令和缩写的大致使用方法如下:

# 加载 https://gist.githubusercontent.com/Hill-98/93db00b01327a0226955c2c6b3b7e137/raw/auto-bin-path.zsh
zinit snippet https://gist.githubusercontent.com/Hill-98/93db00b01327a0226955c2c6b3b7e137/raw/auto-bin-path.zsh

# https://github.com/ohmyzsh/ohmyzsh/blob/master/lib/completion.zsh
# 加载 Oh My Zsh 的实用脚本 completion.zsh
zinit snippet OMZL::completion.zsh

# https://github.com/ohmyzsh/ohmyzsh/blob/master/plugins/archlinux/archlinux.plugin.zsh
# 加载 Oh My Zsh 的插件:ArchLinux
zinit snippet OMZP::archlinux

# https://github.com/ohmyzsh/ohmyzsh/blob/master/themes/ys.zsh-theme
# 加载 Oh My Zsh 的主题:ys
zinit snippet OMZT::ys

# 从 https://github.com/zsh-users/zsh-syntax-highlighting 加载插件
zinit load zsh-users/zsh-syntax-highlighting

# 从 https://github.com/zsh-users/zsh-syntax-highlighting 加载插件 (推荐)
zinit load zsh-users/zsh-syntax-highlighting

对于 Oh My Zsh 的插件/主题,大多数使用zinit snippet即可。

但是你可能会发现,不管是使用 snippet 还是 light (load),加载 Prezto 框架的某些模块时总会出错,这时候就需要用到 zinit 的另一个命令了。

zinit ice: 这个命令的作用就是,设置一些选项,仅在 zinit 下次加载时生效,并且只会生效一次,就像冰一样融化了。

比如 Prezto 框架的某些扩展不止是一个文件,而是一个目录,无论使用那个命令加载它都无效。这时就可以使用 ice 配置下次加载时使用 svn 从 GitHub 下载整个目录。

比如这样:

# 为下一次加载插件设置选项:svn
zinit ice svn

# 这里会使用 svn 而不是 git 进行加载
# 加载 Prezto 框架的 git 插件
zinit light PZTM::git

# ice 设置的选项失效

# 恢复原样,使用 git 加载 (失败)
zinit light PZTM::utility

ice 可以设置的选项有很多,具体可以前往 https://github.com/zdharma-continuum/zinit#ice-modifiers 查看。

zinit 还有一种 for 语法,可以一次性加载多个插件,并设置全局 ice 选项和每个插件的 ice 选项。

for 语法的命令像这样:zinit [global ice options] for [ice options for plugin] <plugin>...

看例子:

# 全局 ice 选项:light-mode (以 light 模式加载)
zinit light-mode for \
    lucid wait zsh-users/zsh-completions \ # 仅适用于此插件的 ice 选项:lucid (静默延迟加载消息), wait (延迟加载)
    zsh-users/zsh-syntax-highlighting # 以 light 模式 (全局 ice 选项) 正常加载

# 不要直接复制上面的代码,因为有语法错误 (不允许在 \ 后面写注释),无法运行。

# 不设置任何 ice 选项,依次加载每个插件。
zinit for \
    zsh-users/zsh-completions \
    zsh-users/zsh-syntax-highlighting

for 语法本身并没有什么特殊功能,它能做到的,使用 ice + snippet/light (load) 同样可以做到。

你可能注意到了,上述命令加载插件时设置了 ice 选项 wait,这个 ice 选项可以使插件延迟加载,以便提高 zsh 的起动速度。你可以对大多数插件使用延迟加载,但是某些插件使用延迟加载可能不会产生预期行为,特别是某些对加载顺序有严格要求的插件。

掌握了以上这些,你应该可以自由的使用 zinit 了。

更多关于 zinit 的技巧和示例,可以查看 zinit 的官方文档。


如果你对 zinit 有那些不懂的地方,欢迎加入 QQ 群与我交流。

微信公众号二维码

微信扫描二维码关注我们

如果觉得文章有帮助到你,可以点击下方的打赏按钮赞助下服务器费用。

小山

一个什么都不会但要装作很厉害的人

文章评论

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据