Speeding up my ZSH shell
121 comments
·July 20, 2025soraminazuki
hdjrudni
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!
soraminazuki
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.
opk
> 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.
The curse of backward compatibility means that zsh does not break your setup or change things on you. And there are still developers left who bear the trauma from the one time that was tried back in the early-mid 90s in the 2.x version series. Sadly that means many new features remain inactive by default, especially anything written in shell-code like command-specific completions.
Sayrus
I for one use and like using both fzf on the search history and the ghost text history. With history, I often end up writing a line that isn't shell so that it fuzzy-matches what I'm looking for. I like having the passive suggestions in addition to that. It doesn't get in my way and if I like what I read, I can accept it.
I'd rather have a good history search than autosuggestion, but having both is a net-positive in my day-to-day.
alabhyajindal
You should try fish shell. Great user experience out of the box, including history suggestions.
cbarrick
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.
kstrauser
IMO, that alternative is Fish shell.
jonS90
I migrated from omz to zimfw and am reasonably happy.
But I have yet to meet anyone in real life who knows what zimfw is.
doubled112
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
wpm
Zim has been my choice since I got sick of multi second startups with OMZ.
bbkane
I'm definitely not an expert, but I configure zsh manually with those fzf and "ghost text". I took some notes in my repo, just copy the relevant portions if you actually want to try this: https://github.com/bbkane/dotfiles/tree/master/zsh
I tweak it occasionally, but for the most part I set it and forget it.
GCUMstlyHarmls
I noticed you're using `z-shell/F-Sy-H`, "Feature-rich Syntax Highlighting for Zsh".
The `z-shell` github org has (or had) some ... bad vibes, I would personally not use any of their code.
- https://recurse.social/@dylnuge/112224580867240812
- https://www.reddit.com/r/commandline/comments/1c3r7ck/zshell...
- https://www.reddit.com/r/zsh/comments/1c3r5gn/zshellzi_users...
You could use `zsh-users/zsh-syntax-highlighting` as an alternative.
imcritic
You split your config across multiple files. That slows startup noticeably.
loeg
I don't know if it's still in vogue, but prezto exists.
pjmlp
No shell does, I am using computers since 1986 and I don't these "pimp my shell" kind of stuff with rainbows and virtual pets.
CLI is for stuff that GUIs and IDEs for whatever reason don't support, or REPL like interactions.
bombcar
The main thing I use the pimpshells for (and all I can honestly say is KNOW I’m using from omZ) is the colored/fancy prompts.
I’ve used colored informative prompts since DOS and having production servers be brilliantly red and dev servers a different color is quite helpful.
thesuitonym
You don't need oh my zsh for colorful prompts though.
chamomeal
I had no idea zsh had decent completion. How does it compare to fish?
kmarc
FWIW I only ever saw zsh at colleagues screen(share) with Oh-My-Zsh
1. Utterly slow and cluttered
2. Colleagues leverage a tenth of its power than what they could achieve with pure bare bones bash
Therefore, never bothered to even try (but had to fix some one liners so that they work on their fancy setup). Also, was surprised that macos switched to it as its default.
I guess I never jumped on the oh-my-it's-so-slow-zsh bandwagon. OTOH, fish+starship combo /that was also recommended here/ seems interesting
sinxccc
1. macOS switched to zsh for default shell, not zsh+oh-my-zsh
2. macOS switched from bash to zsh mainly because of GPLv3
fmbb
Starship can also be really really slow with the defaults, although that is not starship itself beings slow but it appears to sometimes call out to slow tools when display toolchain info.
I always turn all of the languages plugins off in Starship for this reason.
kmarc
Honestly, I'm quite OK with bash+liquidprompt. It is probably an order of magnitude slower than these fancy new stuff.
Even with a huge monorepo and git stats displayed after every press of return it's OK (I win time at other places), but it's intriguing to have the same fast prompt display that I would otherwise have outside local git clone's directories.
What seems sexy about fish/starship is that there is built-in performance check / benchmark for slowdowns.
bardsore
For Fish, I'd recommend https://github.com/IlanCosman/tide instead
kmarc
Oh nice thanks. Great idea with the async prompt update.
The repo hasn't seen new commits since more than a year, but new issues are still opened. Is it abandoned?
nikau
Its been my experience too, they mainly want the eye candy of the prompt to compliment their macbook.
varispeed
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
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.
mattgreenrocks
OMZ shouldn’t be imposing these issues, and autoupdates of a shell script manager is aesthetically disgusting. But there’s also an argument to be made for not cargo culling configuration.
linhns
Yep, many are just throwing shades at it. I combined omz with Antidote, which now gives me a fully featured shell and blazingly fast.
mcdow
Came here to say this. I was able to get an omz featureset from vanilla zsh with a handful of lines of config. It works for the features I was using from omz.
BiteCode_dev
Plus, a lot of the goodies can be added with compiled programs like Starship or Atuin. Less config, faster, work across several shells.
f311a
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
matttproud
I don't have anything against ZSH or similar shells. I think they are great, but they are not my thing.
Latency is a deal-breaker for me, and this is where autocompletion engines generally introduce surprising user-interactive pauses. I've generally settled with using mksh (or OpenBSD's KSH depending on the environment) with little configuration outside of aliases, variables, and few local functions. I'm not left with this inkling feeling like accidentally running find(1) over an AutoFS file system backed by NFS that needs to authenticate, mount, and then run the operation.
When I need something more sophisticated, I lean on using Go or Elvish and potentially delegate some UI elements out to https://github.com/charmbracelet/gum.
I'd rather keep my shell simpler and delegate out any other complexity to these other programs. Autocompletion and these other features simply aren’t free.
cyberpunk
oksh and set -o vi have made it virtually impossible for me to type commands into other people computers.
I get bewildered looks when i hit v and edit my commands in vim from the youth but whatever, they’ll learn someday :))
nobleach
I was an OMZ user pretty much since I adopted ZSH many years ago. I never really experienced much of the slowdown(s) that people tend to complain about. Even still, getting my dotfiles set up on a new machine was always a little bit of pain. I'd try to install OMZ from my OS' package manager, remember that that rarely worked perfectly, gone back to OMZ's webpage and copied the cURL command... the fought with FZF shell integration for about an hour. Finally one Saturday I just stripped it all out. I went with raw ZSH and Antigen for the few plugins I care about. Spinning up new machine is now painless. And I always like simplifying things.
wyclif
Thing is, a lot of how OMZ affects your zsh usage is based on usage patterns. For instance, I usually have zsh running in a terminal that is always open and running. Now, if I close my terminal and restart, then I notice that OMZ is kinda slow and it irritates me, even if it's only for a second. But that almost never happens.
Anyway, I'm going to be revisiting my zsh config soon and I'll be looking for ways to make sure I'm only using plugins that I absolutely do need. My principle in the past with workflows in zsh and Neovim is that I only add crucial plugins and try to keep my config minimal. Maybe I've gotten away from that a bit and need to regroup, so I find threads like this one useful to keep up with what's current.
srvmshr
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
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
MillironX
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...
WhyNotHugo
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...
mroche
I am absolutely stealing this:
export LESS='-RX --quit-if-one-screen'
JimDabell
This is my config:
I find that for persistent configuration like this, it helps to use the long option format and include the man page contents for those options. I don’t have these options memorised so it’s good to have a reference handy to remind me.
yurishimo
What does this do exactly?
bravesoul2
What's with the emoji alias?
WhyNotHugo
Lol. Slipped in by accident, should never have been committed. Part of some messing around / test.
bravesoul2
Funny! I was hoping it was a crazy hack :)
ivanjermakov
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
OMZ should be classified under "supply chain attack as a service". I can't believe anyone uses it.
Jerry2
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.
jauntywundrkind
There's so many plugin systems for zsh. From comments it seems like Pretzo is the main one suggested.
But there's a huge list of different offerings. Looking at https://github.com/sindresorhus/pure?tab=readme-ov-file#inte... , there's also for example zim, zplug, zinit, zi. It's be so great to have see some deeper investigations or comparisons: is Pretzo really the best choice? Aside from seeming popularity, why?
At least found this neat gist with a cheat sheet for different zsh plugin systems (and how very many there are!) https://gist.github.com/olets/06009589d7887617e061481e22cf5a...
Sparkenstein
I moved to fish 3 years ago, haven't noticed a difference till date.
cevn
Fish school represent
notnmeyer
you are wise and have good taste
mcc1ane
satvikpendem
Sadly it's essentially discontinued
nadir_ishiguro
No. The author simply sees it as basically complete and decided to spend the time he has fixing bugs instead of taking care of issues.
satvikpendem
> MOST BUGS WILL GO UNFIXED
trallnag
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
ndr
I've been using it for years now and I can't picture going back.
jimbru
this is the answer
OptionOfT
I use Starship, so this applies to both ZSH & Fish:
If you have the Python environment displayed in Starship, your largest gain in speed is to replace pyenv and pyenv-virtualenv by uv.
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.