[HN Gopher] Speeding up my ZSH shell
___________________________________________________________________
Speeding up my ZSH shell
Author : saikatsg
Score : 115 points
Date : 2025-07-20 15:51 UTC (7 hours ago)
(HTM) web link (scottspence.com)
(TXT) w3m dump (scottspence.com)
| srvmshr wrote:
| I discovered this issue 2-3 years ago. On slightly older
| machines, there was a palpable startup time. My fix was going
| through OhMyZSH and stripping away all the parts that I felt
| unnecessary (I call this my "leanZSH" and its considerably
| lighter version of OMZ.) It doesn't track upstream, and I
| manually update the plugin directory once in a while.
| Surprisingly OhmyZSH is pretty modular and doesn't break easily.
|
| [Not the best hackjob out there but here it is:
|
| https://github.com/gradientwolf/leanzsh
|
| If you want to update it just copy over the latest `plugin/`
| folder from OMZ repo. You can get rid of all the plugins you dont
| want, as well as the themes. It somehow works]
| SamDc73 wrote:
| I think you're better off switching to https://starship.rs
|
| I did try to do my whole zsh config/theme from scratch, but it
| did take some time and lot of small features here and there
| were no worth the effort (like python version, vevn, and such)
| so I just switched to starship which is very fast and easy to
| use
| lompad wrote:
| Why not just use fish at that point? It's been rewritten in
| Rust too.
|
| To me personally, oh-my-zsh and similar projects feel like a
| worse version of the stuff fish brings by default.
| Jubijub wrote:
| Fish is awesome, but there are times you need POSIX/ bash-
| like shell syntax
| ewuhic wrote:
| Then you open bash and get POSIX and not bash-like, but
| bash.
| MillironX wrote:
| You can use Antidote to selectively load the parts of OhMyZsh
| you need - https://github.com/getantidote/use-omz
|
| My own usage: https://code.millironx.com/millironx/nix-
| dotfiles/src/commit...
| rezmason wrote:
| Aha! Now I know that nvm was slowing my shell startup down. Now
| I've reconfigured .zshrc to lazy-load nvm, and everything's
| snappy: zstyle ':omz:plugins:nvm' lazy yes
| saikatsg wrote:
| Cool! Also, there's a zsh wrapper for nvm:
|
| https://github.com/lukechilds/zsh-nvm?tab=readme-ov-file#laz...
| satvikpendem wrote:
| Just use fnm, I like it much better
| dcre wrote:
| Same. I switched to fnm.
| Zizizizz wrote:
| You should try switching to mise. I tried fnm too which was an
| improvement but mise does the same as fast and supports
| essentially every language
| mcc1ane wrote:
| https://github.com/romkatv/powerlevel10k?tab=readme-ov-file#...
| satvikpendem wrote:
| Sadly it's essentially discontinued
| trallnag wrote:
| I'll continue using it until the core features like instant
| prompt and transient prompt start to break or I run into bugs
| that I can't live with
| jimbru wrote:
| this is the answer
| WhyNotHugo wrote:
| Oh-my-zsh has a lot of cool and handy features, but it is a huge
| and complex beast. Personally, I only cared about 3-4 features,
| so I simply removed it and sought out how to enable those
| features alone.
|
| Additionally, a lot of functionality which I wanted wasn't there
| in OMZ, so my setup had a lot of custom bits anyway.
|
| My zshrc, for reference:
| https://git.sr.ht/~whynothugo/dotfiles/tree/269248912920d25e...
| bravesoul2 wrote:
| What's with the emoji alias?
| RGBCube wrote:
| From the post, it seems like ZSH tries to update on every shell
| spawn: DISABLE_AUTO_UPDATE="true"
|
| WTF? Even if we ignore the crime of non-critical software
| updating itself, the fact that it does it on every start instead
| of every day or week is insane.
|
| I do not want my shell sending network requests to odd servers
| without explicit action from me, thanks.
| c-hendricks wrote:
| oh-my-zsh, not zsh
| slacktivism123 wrote:
| >it seems like ZSH tries to update on every shell spawn
|
| Learn your tools first, not bloated frameworks. There's a gulf
| of difference between vanilla zsh and this:
|
| >Community-driven (with 2,400+ contributors) framework for
| managing your zsh configuration
|
| >Includes 300+ optional plugins (rails, git, macOS, hub,
| docker, homebrew, node, php, python, etc)
|
| >140+ themes to spice up your morning, and an auto-update tool
| that makes it easy to keep up with the latest updates from the
| community
| RGBCube wrote:
| Sorry, I meant oh-my-zsh. I know that the core shell doesn't
| update.
|
| I still think it's bad. You shouldn't rely on a million
| different package managers, just 1 is enough. (2 if you are
| feeling spicy: Flatpak)
| Arrowmaster wrote:
| That's what ZSH has turned into. Every new user installs
| OMZ because that's what the Internet tells them to do. Then
| their shell config turns into a huge mess.
|
| So half the users are using OMZ with a bloated slow config
| and the other half are reinventing new config managers
| every year because of how terrible OMZ has become. And
| constantly churning through them as they keep getting
| abandoned.
|
| I've been happily using zsh4humans for years but will need
| to find a replacement at some point as it's now going
| unmaintained too.
| jasonjmcghee wrote:
| Thanks - that pushed me to profile, and as others mentioned nvm
| was the biggest culprit, then powerline status, which i swapped
| to powerline-go. nice and snappy startup time now.
| stouset wrote:
| Fish shell with starship. You will never look back.
| marliechiller wrote:
| Funnily enough, the startup delay of oh-my-zsh is exactly what
| prompted me to try out fish and eventually starship on top. I
| have not looked back as you say!
| rtkaratekid wrote:
| I started using fish on a dare from a coworker who thought it
| would be funny. Joke's on them, it's been five years and I
| still love it. Started using starship this year and agree with
| you.
| leosanchez wrote:
| My fish config is maybe 5-10 lines just starship, zoxide,
| direnv.
| f311a wrote:
| Fish is nice, but syntax difference is a no-go for me. I
| frequently log into different servers that usually use bash.
|
| I miss simple things like alias when I temporary want to assign
| long commands to a shorter alias.
| opk wrote:
| I'd be rather skeptical about the "fix" of updating the
| completion cache once a day only. Enabling oh-my-zsh already runs
| `compinit` and it does so after changing the function path in
| `fpath`. By running it again with a different `fpath` you
| invalidate the previous cache - meaning it builds a fresh cache
| twice every time you start zsh. If you use a plugin framework
| that already runs compinit, simply don't run it again separately.
| And make sure that `compinit` is only run after the final plugin
| or whatever has finished changing `fpath`. If you get that right,
| you'll only ever need to regenerate the cache when something
| actually updates.
| ivanjermakov wrote:
| Oh-my-zsh is very bloated. You might not need it, since its most
| used features can be implemented with zsh directly:
| https://ianyepan.github.io/posts/moving-away-from-ohmyzsh/
| jeffbee wrote:
| OMZ should be classified under "supply chain attack as a
| service". I can't believe anyone uses it.
| raffraffraff wrote:
| As a long time Linux + bash user I switched to zsh three months
| ago when I was forced to use a Mac at a new job. In every
| previous job I was able to insist on Linux, but this one is very
| corporate. I decided not to fight it, except to install AltTab,
| Karabiner, Rectangle and a script that detects which screen my
| mouse is on so I can alt-tab through ALL the stuff on that screen
| (sane XFCE / KDE behaviour).
|
| I can't get used to the atrocious keyboard shortcuts but I have
| gotten used to the "non-UK UK keyboard layout".
|
| And zsh. I honestly don't know why I didn't just brew install
| bash right from the start. Without even realising I was doing it,
| I fought with this bloated bastard for 2 months before finally
| asking what the fuck I was doing.
|
| I sped up my shell by switching back to bash.
| soraminazuki wrote:
| What on earth are you talking about? zsh isn't bloated by any
| stretch, nor is it any slower than bash in any meaningful way.
|
| Chances are, like in the article, you installed oh-my-zsh, a
| _third party_ configuration framework.
| homebrewer wrote:
| Pure zsh is alright, it's pretty much just bash with fantastic
| autocomplete that usually provides short form documentation
| right there along with the options. So no need to remember (or
| look up) what -X -d -f stands for. Get rid of oh-my-zsh and
| give the proper shell another chance.
| Sparkenstein wrote:
| I moved to fish 3 years ago, haven't noticed a difference till
| date.
| notnmeyer wrote:
| you are wise and have good taste
| cevn wrote:
| Fish school represent
| gjvc wrote:
| make sure you haven't got too many plugins enabled (start with
| zero and work up / enable them as needed)
| soraminazuki wrote:
| With articles like these popping up all the time, oh-my-zsh is
| seriously harming zsh's reputation. It's giving the wrong
| impression of zsh being slow and bloated.
|
| zsh doesn't need configuration frameworks or plugins. All it
| needs is a change in the default settings so that its powerful
| completion works out the box. It currently needs more than ideal
| amount of tweaks to the defaults, which is probably why people
| flock to these frameworks.
| hdjrudni wrote:
| I don't want to spend ages figuring out which knobs to turn to
| get a half decent shell. If there's an alternative to oh-my-zsh
| that looks halfway decent, has that nice fzf integrated, and
| the 'ghost text' history suggestions, then I welcome it!
| alabhyajindal wrote:
| You should try fish shell. Great user experience out of the
| box, including history suggestions.
|
| https://fishshell.com
| cbarrick wrote:
| The incompatible syntax of fish makes it a no go for me.
|
| As an SRE, at my day job I often need to copy/paste
| commands that are generated from a playbook.
|
| Our playbooks use Bash, and in practice Zsh is compatible.
| But a co-worker using fish often has to manually modify
| commands before running, and I'm not about that life.
|
| The problem with fish is mostly the different syntax for
| setting variables and lack of heredocs. Sometimes the
| string substitution differences come up too.
| doubled112 wrote:
| Once you have everything figured out, you just keep using the
| config you have. It might be worth the investment. I stopped
| using oh-my-zsh when I realized it was what was causing
| multi-second delays on Raspberry Pis.
|
| I think auto suggestions and syntax highlighting plugins can
| be installed separately from oh-my-zsh.
|
| I use starship for a better prompt, and it works on more
| shells than just Zsh.
|
| I also have Atuin installed to share history across machines,
| and as a benefit the history search is a lot more powerful.
|
| https://github.com/zsh-users/zsh-autosuggestions
|
| https://github.com/zsh-users/zsh-syntax-highlighting
|
| https://starship.rs
|
| https://atuin.sh
| soraminazuki wrote:
| If zsh has its completion fully configured by default, there
| will be no need for most people to turn knobs nor will it be
| a "half decent shell." It'll be the _best_ shell, if it isn
| 't already.
|
| I wonder why ghost text history suggestions are popular
| though, I'd rather not have it. Shell history search works
| better, and I don't want my shell always showing me or
| whoever else is looking at the screen random commands that
| I've previously typed.
| loeg wrote:
| I don't know if it's still in vogue, but prezto exists.
| varispeed wrote:
| Out of curiosity, what is wrong with oh-my-zsh?
|
| I use it and never had any issue. Am I missing out on
| something?
| soraminazuki wrote:
| If it works for you, that's great. But people are installing
| oh-my-zsh almost as if it's an official requirement of zsh,
| run into bloat and performance issues, and goes off telling
| everybody not to use zsh.
|
| Some of the autocompletion settings set by oh-my-zsh are
| useful. But apart from that, the majority of the code
| consists of gazillions of random aliases and functions that
| someone else needed. It pollutes the command namespace for no
| good reason except maybe making users more wary of typos. The
| last time I checked, sudo was aliased as "please", and I
| can't find a single reason why that'd be useful.
|
| oh-my-zsh also introduces a lot of churn, which is why it has
| autoupdates. _Autoupdates_. The only time I needed to change
| my configuration in vanilla zsh because of a change in zsh
| was once or maybe twice over a span of 10+ years.
| f311a wrote:
| Did something similar recently as well. I did not notice any need
| for plugins from day one of switching. Fzf can replace a lot of
| plugins if you know how to use it.
|
| Things like git branch name and virtual envs are handled by
| starship.
|
| My custom config is less than 10 lines now:
| export HISTSIZE=1000000000 export SAVEHIST=$HISTSIZE
| setopt EXTENDED_HISTORY setopt autocd autoload -U
| compinit; compinit source <(fzf --zsh) eval
| "$(starship init zsh)" set -o vi
| samgranieri wrote:
| Ooh, bookmarked! My 11 year old zsh setup, which started from
| YADR and has stuff from other places preserved in chezmoi is
| starting to drag. Time to speed this up or just rip up and redo
| bananapub wrote:
| fwiw you can just use zsh4humans (as long as you promise not to
| bother the author) and have all the things in omz that matter and
| approximately zero startup time
| jpmonette wrote:
| Fish is the way to go! Used to be a fan of ZSH but also struggled
| with performance issues. No performance issue with Fish! Only
| issue might be plugins / some copy/paste bash stuff, but it's so
| worth the performance.
| massysett wrote:
| The instant I saw the title I knew the post would be "I turned
| off oh-my-zsh" or "I tweaked oh-my-zsh."
|
| Yes zsh has a bunch of settings and dense documentation, and it
| can be hard to understand. The problem with something like oh-my-
| zsh is that now you have two things you don't understand, and
| worse, when something doesn't work you don't know which one isn't
| working or where to look.
| Jerry2 wrote:
| I switched to Prezto [0] because I found OMZ too slow. Prezto is
| much faster out of the box and doesn't have a lot of things
| enabled by default. Definitely give it a try if you find OMZ too
| slow on your machine.
|
| [0] https://github.com/sorin-ionescu/prezto
___________________________________________________________________
(page generated 2025-07-20 23:00 UTC)