新购入了一台 Mac ,准备不迁移环境而是从头配置一下环境,现在准备安装 shell 插件了。
之前一直用着 Oh My Zsh ,确实很好用,但是感觉初始化时间越来越长,一个新的 session 要 1 ~ 2 秒才初始化完成,可能是插件有点多了,而且看有人说 Oh My Zsh 的性能差点意思。
问下各位现在有 Oh My Zsh 的上位替代么?可以从使用体验、易用度、生态、性能之类的方面讲讲。

感谢大家的讨论。

对我来说受益较多的评论是 @Kobayashi #31 @xliao #89 @wukaige #102

我应该还是会继续使用 OMZ ,理由如下:

  1. 当前最大的社区,开发人员多,项目不容易暴毙,有问题也比较好解决
  2. 比较熟悉,换成其他的多了一点点学习成本
  3. 砍掉高耗时插件后,初始化时间可以接受

如果有人能讲一下如何排查与优化 hook 耗时(回车耗时)就完美了。

fish

你看看这个可以不,我日常 linux 用这个
starship.rs/zh-CN/

fish

与 oh my zsh 对比体感如何?

我在用 zinit ,比 oh-my-zsh 快些,支持插件的快速加载( light )和懒加载( turbo mode ),还可以使用 snippet 功能直接复用 omz 仓库中的插件

blog.lkwplus.com/posts/macos-dev-setup#zsh-%E9%85%8D%E7%BD%AE

fish + starship ,用了你就回不去了

fish 还不错,对 jethrokuan/z 这个插件爱不释手。

之前用的 zsh4humans ,这个也很强,开箱即用。感觉作者对 zsh 的理解恐怖如斯。

fish
此类主题罕见的 fish 用户大量冒泡哈哈

直接用 fish

zsh4humans 有个很强的优势是 gitstatus 这个插件,它能异步收集 git 信息并显示在 prompt 上。之前一直想把它移植到 fish 上,但很难,没办到。

借楼问问 Windows 终端的工具

自己用 zinit 搭的一个配置: github.com/xukaihub/dotfiles/blob/main/shell/.zshrc

目前 Coding 环境:Alacritty+Zsh+Tmux+Neovim(LazyVim)

1~2 秒真无所谓吧。我不光有 omz ,还有个 zellij ,启动时间要 3~5 秒,但是开了之后基本就不关了,这点时间无所谓的。

建议 fish 一步到胃

zsh 原生+自动补全插件+自己写个 git 分支的小脚本,速度飞起,功能也感觉够用了

oh-my-bash

我使用了 p10k ,通过延迟加载,可以让终端秒开

#14 “一步到胃”,哥们平时都在搜什么呀

fish

优点:fish 的话文件夹路径补全可以随便几个字母只要顺序不错误就可以提示出来,但是 zsh 配合 ohmyzsh 暂时好像还做不到这种效果

fish + starship

zimfw

zimfw github.com/zimfw/zimfw
推荐 theme eriner

折腾大半天就省这开启的一两秒,,,

ohmyfish+fishbone

#20 zsh 也可以,只是很少有人这么配置

zstyle ':completion:' matcher-list 'r:|?=*'

以前试过一段时间,好像有时候反而会增加很多干扰项,后面没用了

我返回 bash 了,用 fzf-tab-completion 实现补全,然后自己封装个 cd ,把补全的初始化放进去,这样第一次切换目录的时候会卡一两秒,但终端始终秒开

插件都注释掉就好了,我只留了 plugins=(autojump git docker)

但即使我关掉 omz, 只用 zsh, 好像也没快多少, 新 tab 还是有肉眼可感知的初始化卡顿

首先 omz 定位是一个终端框架,它包含了主题功能,更多的是好用的插件,然后前面楼层提到的 starship 是 prompt 框架其实可以当做主题美化看待,然后 p10k 是个针对 zsh 做的主题,加载速度一流。

另:看到这么多人推荐 fish 搞的我心里痒痒的想去试试了哈哈😄

关键不是 zsh ,fish ,bash ,而是插件。zsh 插件就是利用 zsh 脚本实现的功能。因为你打开 zsh 出于一个交互式 shell 中,插件加载方式只有 source 脚本才能影响当前进程。

ohmyzsh 是一个框架,即自带了一批插件脚本。插件管理器能帮你下载来自 git 仓库的插件,并帮你 source 插件。

你能做的

  • 砍掉耗时插件
  • 砍掉自己 zsh 配置(如 zshrc )中的耗时命令,如 nvm, brew 调用.
  • 使用 zinit 插件管理器帮你“异步”加载插件(其实是因为 prompt 也是一个插件,在 prompt 渲染后和你反应过来敲击键盘还有点延迟,利用这个时间加载其他插件)
  • 回车耗时也是因为插件,如 zsh fish 提供了完整的钩子机制。大部分回车耗时是因为 git status 检查,优化 git 状态可以使用 gitstatusd ,或者选用支持异步 git 状态查询的 prompt 。

下边是喷子时刻

  • 用什么 go ,rust 写 zsh 插件管理器纯属 NC ,没明白性能瓶颈在哪儿。除了 zinit 以外的插件管理器只是自动化了插件下载,没有在插件加载上做任何优化。插件下载都是 git clone ,插件加载都是 source ,哪有什么区别。
  • starship 并不快,它的简介 blazing fast 完全胡说八道。调用 shell 外部的进程( starship 本身)反而会增加一些额外耗时,它只是跨了平台、跨了 shell 。而且 git 状态查询也没有做任何优化。

    oh-my-posh

    用了很多年 fish

    +1 ZSH 然后自己装插件

    Windows Terminal+posh+powershell 7.x

    fish 不兼容 bash 语法,在其他环境上安装一个开箱即用还不错,常用的话不大推荐

    简单的 arm soc 都用 fish 。。。开箱即用

正常桌面、服务器还是 zinit 或者 oh-my-bash .... 要不有些不兼容,突然来一下还是停膈应的。

Fish

macOS 有这么慢吗?是不是插件开太多了还是别的问题?
我 Windows 下 MSYS2 安装 Oh My Zsh ,启动都不用那么久,感觉上只要 1 秒。

Oh My Zsh 配合 powerlevel10k 也可以用 gitstatusd 。

fish shell 用了一段时间感觉不错。
zsh 切过来需要重新写一下 profiles

#36 用 bash 直接切到 bash 里即可

fish + starship

已经退回 bash, 那个垃圾 ohmyzsh 整天升级,升他妈的

posh 也慢😂😂

原生的终端就挺好用的

原来如此,感谢感谢

去掉 ohmyzsh ,大部分没啥卵用

用 Warp www.warp.dev/ .开箱即用的更好的 shell 体验

已经卸载了 ohmyzsh

感觉速度还可以啊,我 posh 启动延迟都是 300/500ms ,没啥问题. 这玩意改用 go 写后,速度就变慢了。以前要快不少。

最近用 oh-my-posh ,一个配置文件搞到 gist 里,terminal.app, cmder, powershell 都能统一成一个风格的~

感觉 mac 也有点问题,我用 nix 生成同样的配置,在 linux 虚拟机里平均启动时间 80 ,但是 m1 的 mac 就到了 300 左右。
neovim 同样的配置,mac 启动时间 80ms ,linux50ms

竟然没看见一个推 prezto 的,好用,很好用

只推荐不管死活 nushell + starship

直接加插件不用 oh-my-zsh

#31 你字多,我信你

zim

不要直接安装 oh-my-zsh,可以抽出来用它部分插件
一开始我是用 zinit 管理的,现在用 zim,体感上更快,可以参考下我的 dotfiles
github.com/0x7a7a/dotfiles/tree/main/zsh/zim

#52 确实好用,prezto 一直在用。

流下了只会用 bash 的泪水🥲

终于看到一个说的很清楚的啦,其实本质上大多数差距都是 source 。。。

目前用的 zinit ,然后用:zinit snippet OMZ::lib/history.zsh 这种格式去挑自己需要的 omz 插件。
然后用 zsh-defer 和 zinit light-mode 加载其他插件。
其他可以延后加载的东西仍在 async_init() {} 里,同样交给 zsh-defer 加载。

从 OMZ 到 Starship ,到什么都不用 T_T

巧了我也是这个

#57
再补充一下吧,我也算折腾比较久的.(配合我上面的 dotfiles 食用)

对于说 zinit"很快"其实有歧义的,p10k 的作者对于 shell 的速度有一个具体的测试和解释:
github.com/romkatv/zsh-bench

一般来说 zsh 搭配 p10k+zinit/zim 都可以达到不错的启动速度
如果想要变得"好用",除了常见的补全/高亮以外,我推荐搭配使用

  • z.lua 和 fz.sh,目录快速跳转
  • zsh-vi-mode,在 zsh 中使用 vim 模式快速修改
  • fzf-tab,用 fzf 的方式提高 tab 补全使用体验

    Wrap

    github.com/sorin-ionescu/prezto

    oh-my-bash 也可以了。

    zinit 加载速度快;兼容 ohmyzsh 的插件;

    github.com/zdharma-continuum/zinit

    感谢老哥们推荐的 Starship, 在 windows 的 powershell 中替换了原来使用的 oh-my-posh, 现在启动速度快多了, 以前经常启动卡 1-2 秒, 现在基本秒开

    #65 我也是!哈哈哈,内测一直用到现在

    nushell+starship ,非常好用,无敌

    “一个新的 session 要 1 ~ 2 秒才初始化完成”

这个问题我熟,大概率是因为某个配置加载时间的问题,我之前是初始化的时候加了个自动 AWS 命令的授权的配置,后面去了就不会了,秒开

正常的插件基本不会要太多时间,慢的大概率跟网络有关

咋那么多用 fish 的,能说一下哪里好用吗

自己写
bash 写好都不慢何况 zsh...
脚本效能比较 zsh > fish > bash
zsh 本身并没有肉眼可见的慢
只是 fish 有内置用 c 写的功能罢了
会写用 bash 都可
bash 还是挺强的
不要用 oh my XXX 的东西
没有一个精品
plugin 思想也不好 扩充差东西难以復用

多数脚本 大概 99.999%的写出来的是意大利麵条
会采用低效写法 if else 判断也满天飞 一个脚本好几百行 机制运作与效能都不好

fish 的语法和 zsh 不一样,这个需要注意下

www.warp.dev/ 可以试试这个 我用的

要关注性能就要像 #31 楼说的那样去查

自己写的 zsh 主题,写的时候就考虑到了性能,消除了所有能消除的进程间调用,git status 查询也是异步的
做到 4ms per render

github.com/zthxxx/jovial

Fish 语法差异太大哦,如果自己平时还经常写一些 CI 脚本、维护一些服务器、Homelab 之类的,来回切换语法上思考起来挺麻烦的

想象一下你每天在 Windows / macOS 、VSCode / JetBrains 家的 IDEA 之间来回切换快捷键

在好几台设备来回切,mac 用 zsh ,开发服务器 ssh 上去用 fish ,win server 用 nushell (有小 bug )。。。目前没有啥好方案,感觉 nushell 性能最好。。。

用了好久才知道原来 fish 用户这么多了。。。我还以为一直不温不火呢

fish 不适合写脚本 不太好用 程序写太长

mac 上初始化要 2 秒,一半是初始化脚本里面调用的某个工具是 xcode commandline tools 提供的,并且触发了 xcode 的某种逻辑导致阻塞。有时候 sudo xcodebuild -license accept 能解决。

要具体 debug 是什么命令引起的问题,可以参照这个回答 unix.stackexchange.com/a/565927, 在 source oh-my-zsh 之前,先调用 set -x, 这样能看到卡在哪个命令上。

starship+zsh

Tabby + Amazon Q

一开始我一直用 oh-my-zsh ,突然一天就想用 bash ,然后坚持到了现在。

不如直接用 Warp

这么多 fish 推荐,是因为题主说了除了 oh-my-zsh 还有什么推荐。论使用人数,还是 oh-my-zsh 的多,看 stars 数就知道

看下这个 blog.skk.moe/post/make-oh-my-zsh-fly/ 连接的 Profiling 章节

$ /bin/zsh
$ zprof

num calls time self name
-----------------------------------------------------------------------------------
 1) 1 395.66 395.66 33.10% 395.59 395.59 33.09% _zsh_nvm_auto_use
 2) 1 216.22 216.22 18.09% 216.13 216.13 18.08% nvm_die_on_prefix
 3) 1 648.00 648.00 54.20% 168.85 168.85 14.12% nvm_auto
 4) 2 479.15 239.57 40.08% 160.50 80.25 13.43% nvm
 5) 1 102.30 102.30 8.56% 84.99 84.99 7.11% nvm_ensure_version_installed
 6) 2 51.21 25.60 4.28% 29.55 14.78 2.47% compinit
 7) 1 680.18 680.18 56.89% 22.17 22.17 1.85% _zsh_nvm_load
 8) 2 21.66 10.83 1.81% 21.66 10.83 1.81% compaudit
 9) 1 17.31 17.31 1.45% 17.31 17.31 1.45% nvm_is_version_installed
10) 193 17.43 0.09 1.46% 14.50 0.08 1.21% _zsh_autosuggest_bind_widget
[Redacted]

同 zinit ,但是几乎没有易用性,一旦超出插件默认配置想自己搞点什么花样就非常复杂

哈哈,换 fish 的话 oh-my-fish

不配置主题的话,其实用什么插件装什么插件就好了,没必要装个完整的 oh-my-zsh 。

+1 看帖子里这么密集推荐 fish ,我去折腾了 20 分钟,发现语法跟 bash 不兼容,除了迁移环境变量可能还少不了要来回切的场景,纯属增加认知负担了。。

fish 或者 zim

如果你和我一样是 p10k 用户的话, 为什么不尝试 p10k 作者开发的 zsh4humans.
开箱即用, 不需要配置

关于 zsh 管理器启动速度的, 在 zim 仓库有相关图片, 我就是看了这张图片转到 zsh4humans.

github.com/zimfw/zimfw

#11 windows terminal + cmd + starship + scoop 上装个 busybox , 基本上就是 linux 终端类似的体验了

正在尝试 WezTerm + Starship 慢慢配吧

好奇,担心 fish 写脚本不兼容的朋友方便说下场景吗?我平时在 fish 下跑 bash 脚本感觉没啥问题,环境变量也继承

oh my zsh 要 1-2 秒?那也太慢了…可能是插件太多的缘故?

我在用 prezto ,很久没动过了。