Speed Up Your zsh!

近在使用的过程中,慢慢感受到 zsh 加载速度有一点慢,比较影响观感和体验。我原本使用的是 OMZ,其臃肿和缓慢已经多有诟病,于是就尝试换到了 zinit。

What it zinit

Zinit 是一个插件管理器,不同 OMZ 只能称作是一个框架类型的。它有一个非常有用的功能:Turbo Mode, 可以让你的一些插件延迟加载,比如,在打开终端的一刻,zsh 先加载了语法高亮和补全的插件,至于其他类似于 thefuck 的插件就没必要在一开始就加载,这样做可以大大提高加载的速度。

本文只是一个简单的概括和自己的总结,建议去阅读官方文档和 wiki 等。另外,zinit 的作者一个月前忽然删掉了其 repo,不过现在有 user 帮助建立了新的 repo 恢复了!

下图是 zinit 和其他插件的速度对比,更详细的对比信息可以看这里 Comparison of ZSH frameworks and plugin managers

速度对比

My Configure

主要还是基于我原本配置和一些大佬配置得到的现在的配置。

安装过程中是手动安装的,随后在.zshrc中加入:

1
2
ZINIT_HOME="${XDG_DATA_HOME:-${HOME}/.local/share}/zinit/zinit.git"
source "${ZINIT_HOME}/zinit.zsh"

随后是添加prompt

1
eval "$(starship init zsh)"

这里使用的是rust重写的starship,效果不错!

image-20211203105217460

同时设定自动加载tmux

1
2
3
4
if [ -z "$TMUX" ]
then
    tmux
fi

下面就是一些插件的载入过程:

 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
zinit ice lucid wait='1'
zinit light skywind3000/z.lua


zinit ice lucid wait='0' atinit='zpcompinit'
zinit light zdharma-continuum/fast-syntax-highlighting

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

# zinit ice lucid wait='0'
# zinit light zsh-users/zsh-completions
#
# zinit snippet OMZ::lib/completion.zsh
zinit snippet OMZ::lib/history.zsh
zinit snippet OMZ::lib/key-bindings.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 Aloxaf/fzf-tab

至于其他部分就是其中一些插件的设定了,这里需要注意,对于历史记录,需要加入以下内容:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
HISTDB_FILE=$ZDOTDIR/.zsh-history.db
# return the latest used command in the current directory
_zsh_autosuggest_strategy_histdb_top_here() {
    (( $+functions[_histdb_query] )) || return
    local query="
SELECT commands.argv
FROM   history
    LEFT JOIN commands
        ON history.command_id = commands.rowid
    LEFT JOIN places
        ON history.place_id = places.rowid
WHERE commands.argv LIKE '${1//'/''}%'
-- GROUP BY 会导致旧命令的新记录不生效
-- GROUP BY commands.argv
ORDER BY places.dir != '${PWD//'/''}',
	history.start_time DESC
LIMIT 1
"
    typeset -g suggestion=$(_histdb_query "$query")
}

dotfile链接在这里:

https://github.com/flaviusbuffon/dotfiles


updatedupdated2022-01-302022-01-30