还在用 ohmyzsh? 来看看它浪费你多少时间!

相信很多人刚接触到 zsh 时肯定都跟着教程装了 ohmyzsh。ohmyzsh 作为一个自带 300+插件的 zsh 配置框架,功能不可谓不强大。可能你也用不上,甚至不清楚这些功能都有啥用,然而在每次终端启动的时候,它们实实在在地让你傻等好一会儿。当你需要安装一个非 omz 的插件时,你会发现 omz 竟然如此“原始”。

几乎所有 zsh 插件仓库都会教你如何安装:

  1. 下载仓库并解压
  2. 把插件复制到 omz 的插件目录下
  3. 把 lib 文件复制到 omz 的对应目录下(如果有的话)
  4. 修改 ~/.zshrc

而你现在不用去管这些繁琐的操作了。为什么?因为你看到我这篇文章了,马上收藏起来,现在就告诉你用 zinit 如何安装插件

1
2
# 以一个语法高亮插件为例
zinit load zdharma-continuum/fast-syntax-highlighting

啊?就这?

没错,就是这样。想学吗?going down 吧~

1 啥是 zinit

Zinit 是一个灵活快速的 zsh 插件管理器,它允许您安装来自 GitHub 和其他站点的所有内容。

我只想用这一句话来介绍 zinit,如果需要再加一句,那会是 zinit 可以使 zsh 的启动速度提高 50%-80%(数据来源)

1.1 如何安装

如果你打开 github.com 的速度还挺快的,那么你可以用这行命令(或许你还需要加上某些环境变量 XD):

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

不然的话,可以试试这行:

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

1.2 如何灵活

正如上文说到的,你可以用仅仅一行命令就安装好一个插件,而不是解压复制又复制…

除了安装插件,你还可以用 zinit 加载一些代码片段(snippet),同样也很简单:

1
2
zinit snippet 'https://github.com/ohmyzsh/ohmyzsh/raw/master/plugins/git/git.plugin.zsh'
zinit snippet 'https://github.com/zapsaang/terminal/raw/main/plugins/general.zsh'

追求极致的你肯定会说,啊这些 url 也太长了!没关系,zinit 还给你提供了“别名”:

1
zinit snippet OMZP::git/git.plugin.zsh

Zinit 为 ohmyzsh 和 Prezto 提供了可以简化 url 的别名,当然我们也可以利用这一机制来简化自己的代码仓库,这一点在文末再来讲解。

1.3 如何快速

Zinit 的快,一方面是预编译带来的好处,另一方面是 Zinit 提供了一个 Turbo 模式以异步加载插件,因此,不论你需要多少插件,只要使用 Turbo 模式加载,都不会影响终端启动速度!

简单的一行修饰就能 Turbo 起来咯~

1
2
3
4
5
6
7
# zinit ice wait"n" 在n秒后加载下一个插件

zinit ice wait # wait 相当于 wait"0"
zinit light zsh-users/zsh-history-substring-search

zinit ice wait lucid atload'_zsh_autosuggest_start'
zinit light zsh-users/zsh-autosuggestions

怎么样?是不是特别简单。只不过出现了一些奇奇怪怪的修饰词而已啦,之后再解释,别耽误了咱们终端弹射起步。

2 我在用的.zshrc

因为我的工作不是特别依赖终端,所以配置还算简单,寥寥几行而已。

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
38
39
40
41
42
43
44
45
46
47
48
49
50
# ......
### End of Zinit's installer chunk
# 以下内容补充到 "End of Zinit's installer chunk" 注释的后面

ZINIT_1MAP+=(
ZST:: https://github.com/zapsaang/terminal/trunk/
ZSTP:: https://github.com/zapsaang/terminal/trunk/plugins/
ZSTT:: https://github.com/zapsaang/terminal/trunk/themes/
)
ZINIT_2MAP+=(
ZST:: https://raw.githubusercontent.com/zapsaang/terminal/master/
ZSTP:: https://raw.githubusercontent.com/zapsaang/terminal/master/plugins/
ZSTT:: https://raw.githubusercontent.com/zapsaang/terminal/master/themes/
)

# zsh
zinit ice lucid wait"1" atinit="zpcompinit"
zinit light zdharma-continuum/fast-syntax-highlighting
zinit light Aloxaf/fzf-tab

zinit light zsh-users/zsh-history-substring-search
zinit light zsh-users/zsh-autosuggestions

zinit snippet ZSTP::general.zsh
zinit snippet ZSTP::nvim.zsh
zinit snippet ZSTP::icloud.zsh
zinit snippet ZSTP::brew.zsh
zinit snippet ZSTP::go.zsh
zinit snippet ZSTT::fzf_dracula.zsh

zinit snippet OMZL::key-bindings.zsh
zinit snippet OMZL::git.zsh
zinit snippet OMZL::grep.zsh
zinit snippet OMZL::history.zsh
zinit snippet OMZL::clipboard.zsh
zinit snippet OMZL::theme-and-appearance.zsh
zinit snippet OMZP::colored-man-pages/colored-man-pages.plugin.zsh
zinit snippet OMZP::git/git.plugin.zsh
zinit snippet OMZP::sudo/sudo.plugin.zsh

zinit ice svn
zinit snippet OMZP::extract

# key binding
bindkey '^P' history-substring-search-up
bindkey '^N' history-substring-search-down
bindkey '^ ' autosuggest-accept

# Others
zinit load djui/alias-tips

可以点 这里 获取最新版。

下面详细介绍一下这套配置都做了什么。

2.1 URL 别名

1
2
3
4
5
6
7
8
9
10
ZINIT_1MAP+=(
ZST:: https://github.com/zapsaang/terminal/trunk/
ZSTP:: https://github.com/zapsaang/terminal/trunk/plugins/
ZSTT:: https://github.com/zapsaang/terminal/trunk/themes/
)
ZINIT_2MAP+=(
ZST:: https://raw.githubusercontent.com/zapsaang/terminal/master/
ZSTP:: https://raw.githubusercontent.com/zapsaang/terminal/master/plugins/
ZSTT:: https://raw.githubusercontent.com/zapsaang/terminal/master/themes/
)

这部分是前文提到过得 url 别名。你可以在 ZINIT_1MAPZINIT_2MAP 这两个变量里加上你自己的仓库链接,就可以在加载的时候用这些别名啦,改起来也很方便。详细的格式如下:

1
2
3
4
5
6
7
8
ZINIT_1MAP+=(
ALIAS:: https://github.com/{GITHUB_USERNAME}/{GITHUB_REPO_NAME}/trunk/{PATH}/
)
ZINIT_2MAP+=(
ALIAS:: https://raw.githubusercontent.com/{GITHUB_USERNAME}/{GITHUB_REPO_NAME}/master/{PATH}/
)

zinit snippet ALIAS::path/to/xxx.zsh

在实际使用的时候把你要引用的仓库信息和具体目录(根目录直接省略即可)替换上边的变量就可以了。

2.2 语法高亮

1
2
zinit ice lucid wait"1" atinit="zpcompinit"
zinit light zdharma-continuum/fast-syntax-highlighting

这两行呢就是在异步加载一个语法高亮插件。这个语法高亮插件是由 zinit 社区提供的,特点就是快。

2.3 模糊搜索

1
zinit light Aloxaf/fzf-tab

这行在加载一个很厉害的命令行模糊搜索工具,同样使用 tab 键呼出,比默认的不知道高到哪里去啦。但是不光需要加载插件,还需要安装 fzf,如果你是 macOS 用户的话下面这两个命令二选一即可:

1
2
3
4
5
6
# Homebrew 用这行
brew install fzf

# Git 用这行
git clone --depth 1 https://github.com/junegunn/fzf.git ~/.fzf
~/.fzf/install

Linux 用户就点这里找到对应你正在用的包管理器安装命令复制到终端安装吧。

2.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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
# 历史记录搜索,打出来前几个字就会自动从历史输入过的命令里搜索前缀相同的命令
zinit light zsh-users/zsh-history-substring-search

# 自动建议,和历史记录搜索配合,把搜索到的命令展示到光标后面
zinit light zsh-users/zsh-autosuggestions

# 一些个人常用的别名与环境变量
zinit snippet ZSTP::general.zsh
zinit snippet ZSTP::nvim.zsh
zinit snippet ZSTP::icloud.zsh
zinit snippet ZSTP::brew.zsh
zinit snippet ZSTP::go.zsh

# fzf 德库拉主题
zinit snippet ZSTT::fzf_dracula.zsh

# 绑定快捷键,omz提供了很多方便的快捷键,这行命令把它搞过来
zinit snippet OMZL::key-bindings.zsh

# git 辅助,有一些插件会依赖这个,不用 git 也建议加上
zinit snippet OMZL::git.zsh

# grep 辅助,日常不用 grep 的话可以不加
zinit snippet OMZL::grep.zsh

# 命令历史记录,zsh默认是没有 history 记录的,需要加载插件或者
#HISTFILE=~/.zsh_history
#HISTSIZE=1000
#SAVEHIST=1000
#setopt appendhistory
zinit snippet OMZL::history.zsh

# 剪贴板工具,用法
# clipcopy - Copy data to clipboard
# Usage:
# <command> | clipcopy - copies stdin to clipboard
# clipcopy <file> - copies a file's contents to clipboard
# clippaste - "Paste" data from clipboard to stdout
# Usage:
# clippaste - writes clipboard's contents to stdout
# clippaste | <command> - pastes contents and pipes it to another process
# clippaste > <file> - paste contents to a file
zinit snippet OMZL::clipboard.zsh

# 主题插件,要用 omz 主题的话需要这个
zinit snippet OMZL::theme-and-appearance.zsh

# 带高亮的 man 页面
zinit snippet OMZP::colored-man-pages/colored-man-pages.plugin.zsh

# 为一些常用或者不常用的 git 命令提供了别名
zinit snippet OMZP::git/git.plugin.zsh

# 按一下 ESC 会给当前正在输入的命令前加上 sudo
zinit snippet OMZP::sudo/sudo.plugin.zsh

2.5 无脑解压

不知道你有没有被解压文件这件事烦到过:有时候不知道某个文件是什么压缩格式,费半天劲搞清楚了还没有安装对应的软件,现在好了,一个 extract 指令全帮你搞定了。

1
2
zinit ice svn
zinit snippet OMZP::extract

不过要这个插件需要先安装 subversion,因为需要加载一整个目录而不是单个文件。点这里 找你需要的安装命令吧,这里不赘述了。

2.6 绑定其他的快捷键

1
2
3
4
5
6
# Ctrl+P 查找前一个历史记录
bindkey '^P' history-substring-search-up
# Ctrl+N 查找后一个历史记录
bindkey '^N' history-substring-search-down
# Ctrl+Space 接受建议的指令
bindkey '^ ' autosuggest-accept

2.7 别名提醒

在你使用的命令有别名存在时提醒你,多了估计就记住了。

1
zinit load djui/alias-tips

3 进阶用法介绍

3.1 load/light/snippet

load 或者 light 是用来加载插件的,而 snippet 是用来加载代码片段的。

插件一般是整个 github 仓库,仓库的 readme 文件中一般会说明具体的加载命令。
而代码片段就是简单一个或者几个本地或远程文件了,通常内容比较简单。ohmyzsh 的插件就可以用这个命令加载。

1
2
3
4
zinit load  <repo/plugin> # 带报告加载
zinit light <repo/plugin> # 不带报告加载

zinit snippet <URL>

不过我觉得就加载的内容而言,这三个命令的区别并不大,snippet 也可以用 svn 修饰来加载整个仓库或者某个子目录。

3.2 ice 修饰符

ice 修饰词在前面已经见过几次了,这是一个很有意思的东西。它写在 zinit load/light/snippet 命令的前一行,可以控制加载效果,并且只生效一次。至于为什么用 ice 这个单词,作者们的解释是这些 ice 修饰符就像是加到饮料里的冰块,很冰,但只冰一会儿,很快就化了。XD

The word ice means something that’s added (like ice to a drink) – and in Zinit it means adding modifier to a next zinit command, and also something that’s temporary because it melts – and this means that the modification will last only for a single next zinit command.

修饰符 介绍
svn 使用 subversion 程序加载整个目录。为什么不用 git?官方回答是 git 不可以单独 clone 一个子目录
proto 选择加载协议 git, ftp, ftps, sshrsync 等等,默认是 https 。对 snippet 无效
cloneopts cloneopts 的内容传给 git clone ,默认是 --recursive,如果用了这个修饰词但是没有写内容的话,就相当于是禁用了 --recurisive 参数。对 snippet 无效
wait 异步加载,前边提过的
lucid 跳过一些异步加载时的提示

差不多了,就写到这里吧。修饰符还有很多很多,以后用过了再补充(没用过的也不知道写的对不对)。

4 参考

GitHub - zdharma-continuum/zinit: 🌻 Flexible and fast ZSH plugin manager
Introduction - Zinit Wiki
GitHub - zdharma-continuum/pm-perf-test
Zinit 加速你的 zsh —— 最强 zsh 插件管理器 Zinit - sinferwu - 博客园
加速你的 zsh —— 最强 zsh 插件管理器 zplugin/zinit 教程 - Aloxaf’s Blog
ZSH + ZI + PURE 配置教程