从 oh-my-zsh 到 prezto
一、为什么切换?
在一开始接触 oh-my-zsh 的时候说实话只是因为它的主题非常漂亮,例如 powerlevel10k 主题;这对于一个常年在终端上锻炼左右手的人来说确实是非常 “Sexy”。后来随着逐渐深度使用,oh-my-zsh 深度集成的这种一体化插件方案等确实带来了极大便利;例如简单的命令行搜索、git、docker、kuebctl 等各种插件的快速提示等。
但是当终端使用久了以后突然发现,其实像 powerlevel10k 这种花哨的终端主题并不适合我;当逐渐切换回简洁的一些主题,并在 Kubernetes 等大项目的目录下左右横跳时,oh-my-zsh 极慢的响应速度开始展露弊端;仅仅在 Kubernetes 的 Git 仓库目录下,按住回车键终端都能卡出动画…
所以当忍受不了终端这种拉垮的响应速度时,我感觉是时候换一个了。
二、Prezto 介绍
Prezto 官方仓库的介绍很简单,简单到只说 Prezto 是一个 zsh 配置框架,集成了一些主题、插件等。但是如果细说的话,其实 Prezto 最早应该是 oh-my-zsh 的 fork 版本,然后 Prezto 被一点点重写,现在已经基本看不到 oh-my-zsh 的影子了。不过唯一可以肯定的是,性能以及易用性上比 oh-my-zsh 好得多。
Prezto has been rewritten by the author who wanted to achieve a good zsh setup by ensuring all the scripts are making use of zsh syntax. It has a few more steps to install but should only take a few minutes extra. —- John Stevenson
三、Prezto 安装
Prezto 安装按照仓库文档的方法安装即可:
3.1、zsh 安装
首先确定已经安装了 zsh,如果没有安装则需要通过相应系统的包管理器等工具进行安装:
1 |
|
3.2、克隆仓库
在仓库进行克隆时一般分为两种情况,一种默认克隆到 "${ZDOTDIR:-$HOME}/.zprezto"
目录(标准安装):
1 |
|
另一种高级用户可能使用 XDG_CONFIG_HOME
配置:
1 |
|
3.3、创建软连接
Prezto 的安装方式比较方便定制化,在主仓库克隆完成后,只需要将相关的初始化加载配置软连接到 $HOME
目录即可:
1 |
|
不过需要注意的是上面的命令在某些 shell 脚本里直接写可能会有兼容性问题,在这种情况下可以直接通过命令进行简单处理:
1 |
|
至此,Prezto 算是安装完成,重新登录 shell 即可看到效果。
四、细节调整
4.1、更换主题
默认情况下 Prezto 使用 sorin 这个主题,如果对默认主题不满意可以通过 prompt
命令切换:
1 |
|
4.2、grep 高亮
默认情况下 Prezto 在执行 grep 时会对结果进行高亮处理,在某些终端主题上可能会很影响观感:
grep 高亮是在 utility
插件中被开启的,可以通过在 ~/.zpreztorc
中增加以下配置关闭:
1 |
|
4.3、命令、语法高亮
Prezto 通过 syntax-highlighting 插件提供了各种语法高亮配置,通过解开以下配置的注释开启更多的自动高亮:
1 |
|
需要注意的是,默认 root 高亮开启后,root 用户所有执行命令都会高亮,这样可能在主题配色上导致看不清输入的命令,可以简单的移除 root 高亮配置即可。
4.4、自定义命令高亮
在 syntax-highlighting
插件中启用了 pattern
高亮后,可以通过以下配置设置一些自定义的命令高亮配置,例如 rm -rf
等:
1 |
|
4.5、历史命令搜索
oh-my-zsh 通过上下箭头按键来快速搜索历史命令是一个非常实用的功能,在切换到 Perzto 后会发现上下箭头的搜索变成了全命令的模糊匹配;例如输入 vim
然后上下翻页会匹配到位于命令中间带有 vim
字样的历史命令:
解决这个问题需要将 history-substring-search
插件依赖的 zsh-history-substring-search
切换到 master 分支并增加 HISTORY_SUBSTRING_SEARCH_PREFIXED
变量配置:
1 |
|
同时历史搜索里还有一个问题是同样的命令如果出现多次会被多次匹配,解决这个问题需要增加以下变量:
1 |
|
五、其他插件
更多可以使用的插件请参考 modules 目录下每个插件的文档,以及如何开启和配置。
为了方便自己使用,我在我的 init 项目下创建了快速初始化脚本,以上这些调整将自动完成:
1 |
|