V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
bigbugbag
V2EX  ›  程序员

macOS 中有 Oh My Zsh 的上位替代么?

  •  1
     
  •   bigbugbag · 1 天前 · 8175 次点击

    新购入了一台 Mac ,准备不迁移环境而是从头配置一下环境,现在准备安装 shell 插件了。

    之前一直用着 Oh My Zsh ,确实很好用,但是感觉初始化时间越来越长,一个新的 session 要 1 ~ 2 秒才初始化完成,可能是插件有点多了,而且看有人说 Oh My Zsh 的性能差点意思。

    问下各位现在有 Oh My Zsh 的上位替代么?可以从使用体验、易用度、生态、性能之类的方面讲讲。

    第 1 条附言  ·  4 小时 21 分钟前
    感谢大家的讨论。

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

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

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

    如果有人能讲一下如何排查与优化 hook 耗时(回车耗时)就完美了。
    106 条回复    2024-11-14 10:50:11 +08:00
    1  2  
    zengxs
        1
    zengxs  
       1 天前   ❤️ 4
    fish
    me262
        2
    me262  
       1 天前
    你看看这个可以不,我日常 linux 用这个
    https://starship.rs/zh-CN/
    FryFryFry
        3
    FryFryFry  
       1 天前
    fish
    bigbugbag
        4
    bigbugbag  
    OP
       1 天前
    @me262 与 oh my zsh 对比体感如何?
    synthpop123
        5
    synthpop123  
       1 天前   ❤️ 1
    我在用 zinit ,比 oh-my-zsh 快些,支持插件的快速加载( light )和懒加载( turbo mode ),还可以使用 snippet 功能直接复用 omz 仓库中的插件

    https://blog.lkwplus.com/posts/macos-dev-setup#zsh-%E9%85%8D%E7%BD%AE
    Azone
        6
    Azone  
       1 天前
    fish + starship ,用了你就回不去了
    tinytoadd
        7
    tinytoadd  
       1 天前
    fish 还不错,对 jethrokuan/z 这个插件爱不释手。

    之前用的 zsh4humans ,这个也很强,开箱即用。感觉作者对 zsh 的理解恐怖如斯。
    mcfog
        8
    mcfog  
       1 天前
    fish
    此类主题罕见的 fish 用户大量冒泡哈哈
    ospider
        9
    ospider  
       1 天前
    直接用 fish
    tinytoadd
        10
    tinytoadd  
       1 天前
    @tinytoadd zsh4humans 有个很强的优势是 gitstatus 这个插件,它能异步收集 git 信息并显示在 prompt 上。之前一直想把它移植到 fish 上,但很难,没办到。
    AlexShui
        11
    AlexShui  
       1 天前 via Android
    借楼问问 Windows 终端的工具
    longlongame
        12
    longlongame  
       1 天前   ❤️ 1
    自己用 zinit 搭的一个配置: https://github.com/xukaihub/dotfiles/blob/main/shell/.zshrc

    目前 Coding 环境:Alacritty+Zsh+Tmux+Neovim(LazyVim)
    PTLin
        13
    PTLin  
       1 天前
    1~2 秒真无所谓吧。我不光有 omz ,还有个 zellij ,启动时间要 3~5 秒,但是开了之后基本就不关了,这点时间无所谓的。
    FalconD
        14
    FalconD  
       1 天前 via Android
    建议 fish 一步到胃
    sketcherly
        15
    sketcherly  
       1 天前
    zsh 原生+自动补全插件+自己写个 git 分支的小脚本,速度飞起,功能也感觉够用了
    airborne007
        16
    airborne007  
       1 天前
    oh-my-bash
    yihy8023
        17
    yihy8023  
       1 天前
    我使用了 p10k ,通过延迟加载,可以让终端秒开
    SimonOne
        18
    SimonOne  
       1 天前
    @FalconD #14 “一步到胃”,哥们平时都在搜什么呀
    jiefengwang
        19
    jiefengwang  
       1 天前
    fish
    jiefengwang
        20
    jiefengwang  
       1 天前
    @bigbugbag
    优点:fish 的话文件夹路径补全可以随便几个字母只要顺序不错误就可以提示出来,但是 zsh 配合 ohmyzsh 暂时好像还做不到这种效果
    Binwalker
        21
    Binwalker  
       1 天前
    fish + starship
    Blunt1991
        22
    Blunt1991  
       1 天前
    zimfw
    charlie21
        23
    charlie21  
       1 天前
    zimfw https://github.com/zimfw/zimfw
    推荐 theme eriner
    treizeor
        24
    treizeor  
       1 天前
    折腾大半天就省这开启的一两秒,,,
    liubaicai
        25
    liubaicai  
       1 天前
    ohmyfish+fishbone
    aloxaf
        26
    aloxaf  
       1 天前
    @jiefengwang #20 zsh 也可以,只是很少有人这么配置

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

    以前试过一段时间,好像有时候反而会增加很多干扰项,后面没用了
    Meursau1T
        27
    Meursau1T  
       1 天前
    我返回 bash 了,用 fzf-tab-completion 实现补全,然后自己封装个 cd ,把补全的初始化放进去,这样第一次切换目录的时候会卡一两秒,但终端始终秒开
    lerry
        28
    lerry  
       1 天前
    插件都注释掉就好了,我只留了 plugins=(autojump git docker)
    wu67
        29
    wu67  
       1 天前
    但即使我关掉 omz, 只用 zsh, 好像也没快多少, 新 tab 还是有肉眼可感知的初始化卡顿
    DualVectorFoil
        30
    DualVectorFoil  
       1 天前 via Android
    首先 omz 定位是一个终端框架,它包含了主题功能,更多的是好用的插件,然后前面楼层提到的 starship 是 prompt 框架其实可以当做主题美化看待,然后 p10k 是个针对 zsh 做的主题,加载速度一流。

    另:看到这么多人推荐 fish 搞的我心里痒痒的想去试试了哈哈😄
    Kobayashi
        31
    Kobayashi  
       1 天前 via Android   ❤️ 14
    关键不是 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 状态查询也没有做任何优化。
    zhengxiexie2
        32
    zhengxiexie2  
       1 天前
    oh-my-posh
    FightPig
        33
    FightPig  
       1 天前
    用了很多年 fish
    psklf
        34
    psklf  
       1 天前
    @sketcherly +1 ZSH 然后自己装插件
    thinkershare
        35
    thinkershare  
       1 天前
    @AlexShui Windows Terminal+posh+powershell 7.x
    yaytohkay
        36
    yaytohkay  
       1 天前   ❤️ 4
    fish 不兼容 bash 语法,在其他环境上安装一个开箱即用还不错,常用的话不大推荐
    chopin1998519
        37
    chopin1998519  
       1 天前
    简单的 arm soc 都用 fish 。。。开箱即用

    正常桌面、服务器还是 zinit 或者 oh-my-bash .... 要不有些不兼容,突然来一下还是停膈应的。
    guanhui07
        38
    guanhui07  
       1 天前 via iPhone
    Fish
    ysc3839
        39
    ysc3839  
       1 天前 via Android
    macOS 有这么慢吗?是不是插件开太多了还是别的问题?
    我 Windows 下 MSYS2 安装 Oh My Zsh ,启动都不用那么久,感觉上只要 1 秒。
    ysc3839
        40
    ysc3839  
       1 天前 via Android
    @tinytoadd Oh My Zsh 配合 powerlevel10k 也可以用 gitstatusd 。
    zhangchioulin
        41
    zhangchioulin  
       1 天前
    fish shell 用了一段时间感觉不错。
    zsh 切过来需要重新写一下 profiles
    limbo0
        42
    limbo0  
       1 天前
    @yaytohkay #36 用 bash 直接切到 bash 里即可

    fish + starship
    Rrrrrr
        43
    Rrrrrr  
       1 天前
    已经退回 bash, 那个垃圾 ohmyzsh 整天升级,升他妈的
    AlexShui
        44
    AlexShui  
       1 天前 via Android
    @thinkershare posh 也慢😂😂
    meeop
        45
    meeop  
       1 天前
    原生的终端就挺好用的
    jiefengwang
        46
    jiefengwang  
       1 天前
    @aloxaf 原来如此,感谢感谢
    mayli
        47
    mayli  
       1 天前
    去掉 ohmyzsh ,大部分没啥卵用
    javakun
        48
    javakun  
       1 天前
    用 Warp https://www.warp.dev/ .开箱即用的更好的 shell 体验


    已经卸载了 ohmyzsh
    thinkershare
        49
    thinkershare  
       1 天前
    @AlexShui 感觉速度还可以啊,我 posh 启动延迟都是 300/500ms ,没啥问题. 这玩意改用 go 写后,速度就变慢了。以前要快不少。
    since2021
        50
    since2021  
       1 天前
    最近用 oh-my-posh ,一个配置文件搞到 gist 里,terminal.app, cmder, powershell 都能统一成一个风格的~
    rick13
        51
    rick13  
       1 天前


    感觉 mac 也有点问题,我用 nix 生成同样的配置,在 linux 虚拟机里平均启动时间 80 ,但是 m1 的 mac 就到了 300 左右。
    neovim 同样的配置,mac 启动时间 80ms ,linux50ms
    DesnLee
        52
    DesnLee  
       1 天前
    竟然没看见一个推 prezto 的,好用,很好用
    tiiime
        53
    tiiime  
       23 小时 50 分钟前
    只推荐不管死活 nushell + starship
    xiadengmaX1
        54
    xiadengmaX1  
       23 小时 49 分钟前
    直接加插件不用 oh-my-zsh
    leonleung
        55
    leonleung  
       23 小时 40 分钟前
    @Kobayashi #31 你字多,我信你
    imkerberos
        56
    imkerberos  
       23 小时 29 分钟前
    zim
    Immortal
        57
    Immortal  
       23 小时 28 分钟前   ❤️ 1
    不要直接安装 oh-my-zsh,可以抽出来用它部分插件
    一开始我是用 zinit 管理的,现在用 zim,体感上更快,可以参考下我的 dotfiles
    https://github.com/0x7a7a/dotfiles/tree/main/zsh/zim
    wenyuan5
        58
    wenyuan5  
       23 小时 2 分钟前
    @DesnLee #52 确实好用,prezto 一直在用。
    Tiande
        59
    Tiande  
       22 小时 59 分钟前 via Android
    流下了只会用 bash 的泪水🥲
    qweruiop
        60
    qweruiop  
       22 小时 53 分钟前
    @Kobayashi 终于看到一个说的很清楚的啦,其实本质上大多数差距都是 source 。。。
    Aixtuz
        61
    Aixtuz  
       22 小时 50 分钟前
    目前用的 zinit ,然后用:zinit snippet OMZ::lib/history.zsh 这种格式去挑自己需要的 omz 插件。
    然后用 zsh-defer 和 zinit light-mode 加载其他插件。
    其他可以延后加载的东西仍在 async_init() {} 里,同样交给 zsh-defer 加载。
    kneep
        62
    kneep  
       22 小时 50 分钟前
    从 OMZ 到 Starship ,到什么都不用 T_T
    polarHEX
        63
    polarHEX  
       22 小时 38 分钟前
    @Azone 巧了我也是这个
    Immortal
        64
    Immortal  
       21 小时 59 分钟前
    @Immortal #57
    再补充一下吧,我也算折腾比较久的.(配合我上面的 dotfiles 食用)

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

    一般来说 zsh 搭配 p10k+zinit/zim 都可以达到不错的启动速度
    如果想要变得"好用",除了常见的补全/高亮以外,我推荐搭配使用
    - z.lua 和 fz.sh,目录快速跳转
    - zsh-vi-mode,在 zsh 中使用 vim 模式快速修改
    - fzf-tab,用 fzf 的方式提高 tab 补全使用体验
    hslx111
        65
    hslx111  
       21 小时 49 分钟前
    Wrap
    xiaozhu317
        66
    xiaozhu317  
       21 小时 39 分钟前
    hackerwilson
        67
    hackerwilson  
       21 小时 38 分钟前
    oh-my-bash 也可以了。
    dinghmcn
        68
    dinghmcn  
       21 小时 34 分钟前
    zinit 加载速度快;兼容 ohmyzsh 的插件;

    https://github.com/zdharma-continuum/zinit
    bruce0
        69
    bruce0  
       21 小时 29 分钟前
    感谢老哥们推荐的 Starship, 在 windows 的 powershell 中替换了原来使用的 oh-my-posh, 现在启动速度快多了, 以前经常启动卡 1-2 秒, 现在基本秒开
    yiqiao
        70
    yiqiao  
       21 小时 26 分钟前
    @hslx111 #65 我也是!哈哈哈,内测一直用到现在
    yb2313
        71
    yb2313  
       21 小时 14 分钟前
    nushell+starship ,非常好用,无敌
    Lockeysama
        72
    Lockeysama  
       20 小时 55 分钟前
    “一个新的 session 要 1 ~ 2 秒才初始化完成”

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


    正常的插件基本不会要太多时间,慢的大概率跟网络有关
    littlewing
        73
    littlewing  
       20 小时 38 分钟前
    咋那么多用 fish 的,能说一下哪里好用吗
    james122333
        74
    james122333  
       20 小时 36 分钟前 via Android
    自己写
    bash 写好都不慢何况 zsh...
    脚本效能比较 zsh > fish > bash
    zsh 本身并没有肉眼可见的慢
    只是 fish 有内置用 c 写的功能罢了
    会写用 bash 都可
    bash 还是挺强的
    不要用 oh my XXX 的东西
    没有一个精品
    plugin 思想也不好 扩充差东西难以復用
    james122333
        75
    james122333  
       20 小时 25 分钟前 via Android
    多数脚本 大概 99.999%的写出来的是意大利麵条
    会采用低效写法 if else 判断也满天飞 一个脚本好几百行 机制运作与效能都不好
    RicardoY
        76
    RicardoY  
       19 小时 58 分钟前
    fish 的语法和 zsh 不一样,这个需要注意下
    blackcellcode
        77
    blackcellcode  
       19 小时 49 分钟前
    https://www.warp.dev/ 可以试试这个 我用的
    zthxxx
        78
    zthxxx  
       19 小时 44 分钟前
    要关注性能就要像 #31 楼说的那样去查

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

    https://github.com/zthxxx/jovial
    zthxxx
        79
    zthxxx  
       19 小时 41 分钟前
    Fish 语法差异太大哦,如果自己平时还经常写一些 CI 脚本、维护一些服务器、Homelab 之类的,来回切换语法上思考起来挺麻烦的

    想象一下你每天在 Windows / macOS 、VSCode / JetBrains 家的 IDEA 之间来回切换快捷键
    lanbos
        80
    lanbos  
       19 小时 40 分钟前
    在好几台设备来回切,mac 用 zsh ,开发服务器 ssh 上去用 fish ,win server 用 nushell (有小 bug )。。。目前没有啥好方案,感觉 nushell 性能最好。。。
    newtype0092
        81
    newtype0092  
       19 小时 39 分钟前
    用了好久才知道原来 fish 用户这么多了。。。我还以为一直不温不火呢
    james122333
        82
    james122333  
       19 小时 32 分钟前 via Android
    @zthxxx

    fish 不适合写脚本 不太好用 程序写太长
    billlee
        83
    billlee  
       19 小时 27 分钟前   ❤️ 2
    mac 上初始化要 2 秒,一半是初始化脚本里面调用的某个工具是 xcode commandline tools 提供的,并且触发了 xcode 的某种逻辑导致阻塞。有时候 sudo xcodebuild -license accept 能解决。

    要具体 debug 是什么命令引起的问题,可以参照这个回答 https://unix.stackexchange.com/a/565927, 在 source oh-my-zsh 之前,先调用 set -x, 这样能看到卡在哪个命令上。
    webcape233
        84
    webcape233  
       19 小时 24 分钟前 via iPhone
    starship+zsh
    gl3081
        85
    gl3081  
       18 小时 19 分钟前
    Tabby + Amazon Q
    BeforeTooLate
        86
    BeforeTooLate  
       17 小时 41 分钟前
    一开始我一直用 oh-my-zsh ,突然一天就想用 bash ,然后坚持到了现在。
    zhangxu1621
        87
    zhangxu1621  
       17 小时 40 分钟前
    不如直接用 Warp
    9
        88
    9  
       17 小时 31 分钟前
    @DualVectorFoil 这么多 fish 推荐,是因为题主说了除了 oh-my-zsh 还有什么推荐。论使用人数,还是 oh-my-zsh 的多,看 stars 数就知道
    xliao
        89
    xliao  
       17 小时 25 分钟前   ❤️ 1
    看下这个 https://blog.skk.moe/post/make-oh-my-zsh-fly/ 连接的 Profiling 章节

    ```shell
    $ /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]
    ```
    zed1018
        90
    zed1018  
       17 小时 24 分钟前
    @synthpop123 同 zinit ,但是几乎没有易用性,一旦超出插件默认配置想自己搞点什么花样就非常复杂
    ycqy
        91
    ycqy  
       17 小时 6 分钟前
    哈哈,换 fish 的话 oh-my-fish
    HongyuGao
        92
    HongyuGao  
       16 小时 33 分钟前
    不配置主题的话,其实用什么插件装什么插件就好了,没必要装个完整的 oh-my-zsh 。
    aarontian
        93
    aarontian  
       16 小时 28 分钟前   ❤️ 1
    @littlewing +1 看帖子里这么密集推荐 fish ,我去折腾了 20 分钟,发现语法跟 bash 不兼容,除了迁移环境变量可能还少不了要来回切的场景,纯属增加认知负担了。。
    WebKit
        94
    WebKit  
       15 小时 57 分钟前 via Android
    fish 或者 zim
    jqtmviyu
        95
    jqtmviyu  
       15 小时 43 分钟前
    如果你和我一样是 p10k 用户的话, 为什么不尝试 p10k 作者开发的 zsh4humans.
    开箱即用, 不需要配置

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

    https://github.com/zimfw/zimfw
    SteveLi77
        96
    SteveLi77  
       15 小时 32 分钟前
    @AlexShui #11 windows terminal + cmd + starship + scoop 上装个 busybox , 基本上就是 linux 终端类似的体验了
    Herdsman
        97
    Herdsman  
       15 小时 19 分钟前
    正在尝试 WezTerm + Starship 慢慢配吧
    coldle
        98
    coldle  
       14 小时 22 分钟前 via Android
    好奇,担心 fish 写脚本不兼容的朋友方便说下场景吗?我平时在 fish 下跑 bash 脚本感觉没啥问题,环境变量也继承
    tianshilei1992
        99
    tianshilei1992  
       12 小时 40 分钟前
    oh my zsh 要 1-2 秒?那也太慢了…可能是插件太多的缘故?
    zander
        100
    zander  
       6 小时 10 分钟前
    我在用 prezto ,很久没动过了。
    1  2  
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5599 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 06:34 · PVG 14:34 · LAX 22:34 · JFK 01:34
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.