8 Zsh Plugins That Made My Terminal Actually Enjoyable
I spent years fighting my shell. These plugins finally made it work with me.
Terminal Productivity
8 Zsh Plugins That Made My Terminal Actually Enjoyable
I spent years fighting my shell. These plugins finally made it work with me.
There’s a specific kind of misery that comes from living in your terminal all day while it refuses to cooperate. You mis-type a command for the third time.
You try to remember whether it was git checkout or git switch. You scroll through a history log like an archaeologist, hoping the right incantation buried somewhere in there.
Photo by Joshua Reddekopp on Unsplash
I hit that wall about two years into heavy backend work. My terminal was functional, technically, but it felt like driving a car with no power steering. Everything required slightly more effort than it should.
Then I started actually configuring Zsh.
Most developers know about Oh My Zsh — the giant framework that manages themes and plugins for Zsh — but stop there. The real leverage isn’t the framework. It’s knowing which plugins solve your actual daily friction. After a lot of trial and error, here are the eight that stuck.
1. zsh-autosuggestions
Install: github.com/zsh-users/zsh-autosuggestions
This is the plugin I miss the most whenever I work on a machine that doesn’t have it. As you type, it shows a greyed-out completion based on your history. Hit the right arrow key and it fills in the rest.
# You type:
docker-compose up -d
# Next time, type just:
dock
# And you'll see the ghost text:
docker-compose up -d
The implementation detail that makes it actually good: it matches against your most recently used commands first, not alphabetically. So the suggestions that surface are the ones you actually want.
# In .zshrc, add:
source ~/.zsh/zsh-autosuggestions/zsh-autosuggestions.zsh
# Optional: change the suggestion color if it's hard to see
ZSH_AUTOSUGGEST_HIGHLIGHT_STYLE="fg=#555555"
After a week with this, typing full commands starts to feel wasteful.
2. zsh-syntax-highlighting
Install: github.com/zsh-users/zsh-syntax-highlighting
The feedback loop on terminal errors is brutal. Type a bad command, hit enter, get an error, repeat. This plugin pushes that feedback to the left: valid commands turn green as you type, invalid ones stay red.
# Valid command — shows green
ls -la /home/user
# Typo - stays red (won't waste your time running it)
lss -la /home/user
It also highlights strings, pipes, and flags differently, which makes complex one-liners much easier to read before you execute them.
# In .zshrc (load this LAST among your plugins — order matters):
source /path/to/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh
One practical note: this plugin has to be sourced after any other plugin that manipulates the command line. Get that order wrong and you’ll spend twenty minutes wondering why nothing works.
3. fzf
Install: github.com/junegunn/fzf
Technically fzf isn’t a Zsh plugin — it’s a standalone binary with Zsh keybindings. But once you wire it into your shell, it changes how you interact with history, files, and processes.
The killer feature is Ctrl+R. Normally, that opens reverse history search, which works fine until you have thousands of entries. With fzf, it opens a filterable, real-time-searchable popup:
# Press Ctrl+R and type any fragment:
# fzf shows:
aws s3 sync ./dist s3://my-bucket --delete
docker run -it --rm -v $(pwd):/app python:3.11
> kubectl get pods -n staging --watch
You can fuzzy-match any part of any command. It also gives you Ctrl+T for file search and Alt+C for directory jumping.
# Add to .zshrc after installing:
[ -f ~/.fzf.zsh ] && source ~/.fzf.zsh
# Optional: use ripgrep as the backend (much faster on large repos)
export FZF_DEFAULT_COMMAND='rg --files --hidden --follow --glob "!.git/*"'
I use this probably fifty times a day without noticing it anymore. That’s the sign of a good tool.
4. z (or zoxide)
Install (z): github.com/rupa/z Install (zoxide, newer): github.com/ajeetdsouza/zoxide
Both tools track which directories you visit most often and let you jump to them by typing a fragment. zoxide is the Rust rewrite — faster and with slightly smarter matching.
# You've visited ~/projects/work/api/v2/src before
# Now just type:
z api
# Or with zoxide's interactive mode:
zi # opens fzf selector with your most-visited dirs
The algorithm weights recency and frequency together (the name z actually comes from "frecency" — frequency + recency). So the directory you visited yesterday gets ranked higher than one you visited six months ago, even if you visited that one more times overall.
# For zoxide, add to .zshrc:
eval "$(zoxide init zsh)"
# Optional: replace cd entirely
alias cd='z'
Once you use this for a week, navigating with cd ~/long/nested/path/to/project feels like a step backward.
5. git Plugin (Oh My Zsh built-in)
Docs: github.com/ohmyzsh/ohmyzsh/tree/master/plugins/git
If you’re using Oh My Zsh, this is already available — you just have to enable it. It ships with over 150 Git aliases, but the ones I use daily are maybe ten of them:
gst # git status
ga . # git add .
gcm # git commit -m
gp # git push
gpl # git pull
gco # git checkout
gcb # git checkout -b
glog # git log --oneline --decorate --graph
gd # git diff
grb # git rebase
The glog alias deserves special mention. It renders your commit graph in the terminal with color and branch labels, which is genuinely useful when you're trying to understand a messy branch history.
# Enable in .zshrc:
plugins=(git)
# Check available aliases anytime:
alias | grep "^g"
This sounds like a small thing. It isn’t. You run git status probably forty times a day. That's forty times you're typing four characters instead of ten.
6. you-should-use
Install: github.com/MichaelAquilina/zsh-you-should-use
Here’s the problem with setting up a bunch of aliases: you forget them. You carefully define alias k=kubectl and then three weeks later you're typing kubectl get pods like a person who never configured anything.
This plugin detects when you run a command you already have an alias for, and prints a reminder:
# You type:
git status
# Plugin says:
Found existing alias for "git status". You should use: gst
It’s mildly annoying at first. That’s the point. Within a week, the behavior is reinforced and the reminders stop.
# In .zshrc:
plugins=(... you-should-use)
# If reminders feel aggressive, change the mode:
export YSU_MODE=ALL # reminds for aliases and abbreviations
export YSU_HARDCORE=1 # blocks command until you use the alias (extreme)
YSU_HARDCORE=1 is not for everyone. I used it for a month to beat the muscle memory out of myself, then turned it off.
7. zsh-history-substring-search
Install: github.com/zsh-users/zsh-history-substring-search
Default Zsh history navigation is the up arrow cycling through everything in order. Fine if the command you want was two commands ago. Useless if it was from last Tuesday.
This plugin lets you type any substring and then use the up/down arrows to cycle through only matching entries:
# Type:
docker
# Press Up arrow:
# Cycles through:
docker run -it ubuntu bash
docker-compose up --build
docker ps -a
docker exec -it mycontainer sh
It’s a subtle change but it cuts the mental overhead of “what was the exact command I ran?” significantly.
# In .zshrc:
plugins=(... history-substring-search)
# Bind to up/down keys:
bindkey '^[[A' history-substring-search-up
bindkey '^[[B' history-substring-search-down
Note that the key codes can vary between terminal emulators. If the up arrow doesn’t work after adding the binding, check your terminal’s key mappings.
8. powerlevel10k
Install: github.com/romkatv/powerlevel10k
Prompt themes are usually aesthetic. Powerlevel10k is functional. It shows you — without any lag — the current Git branch, whether you have uncommitted changes, the active Python/Node version, Kubernetes context, the last command’s exit code, and execution time, all in a well-organized single line (or two lines, or whatever you configure).
# Example prompt:
~/projects/api ❯ main ✔ py 3.11.4 k8s:staging 2.3s
The speed comes from its instant prompt feature — it renders a cached version of the prompt while the shell initializes, so you never see a blank line on startup.
# Enable instant prompt at the very top of .zshrc:
if [[ -r "${XDG_CACHE_HOME:-$HOME/.cache}/p10k-instant-prompt-${(%):-%n}.zsh" ]]; then
source "${XDG_CACHE_HOME:-$HOME/.cache}/p10k-instant-prompt-${(%):-%n}.zsh"
fi
Run p10k configure after installing and it walks you through a visual setup wizard. Takes five minutes, produces a usable prompt out of the box.
If you’re starting from scratch, the path is:
- Install Oh My Zsh for the plugin management layer.
- Add
zsh-autosuggestionsandzsh-syntax-highlightingfirst — these two alone will change your daily experience. - Install
fzfand wire it up. Spend a day just usingCtrl+R. - Add
zorzoxideand stop manually navigating directories. - Layer in
you-should-useto actually internalize your aliases. - Configure
powerlevel10klast, since it needs to sit at the bottom of your prompt stack.
Your final plugins line in .zshrc will look something like:
plugins=(
git
zsh-autosuggestions
zsh-syntax-highlighting
history-substring-search
you-should-use
)
Note that zsh-syntax-highlighting should always be the last plugin sourced, or things will break in confusing ways.
These plugins do add startup time to your shell. On a recent machine it’s negligible — maybe 50ms total. On older hardware or in Docker containers where you’re spawning shells constantly, it can add up.
If performance matters in a particular environment, run zsh -i -c exit before and after adding plugins, and skip the ones that don't justify their cost. zsh-autosuggestions and fzf are worth almost any startup penalty. Some of the others are more negotiable.
The terminal doesn’t have to be a friction machine. Most developers accept the defaults because configuration feels like yak shaving — time spent not writing actual code. But a few hours of setup here pays back thousands of micro-frustrations over months.
Every command you recall faster, every typo you catch before executing it, every path you navigate in three keystrokes instead of twenty — they don’t feel like productivity wins in the moment. They just make the day feel a little less like you’re fighting your own tools.
That’s worth something.
If you found this useful, the next step is reading the actual documentation for each plugin — especially fzf. Most people use 20% of what it can do.
메타데이터
- post_id
- 71b45db34c54
- slug
- 8-zsh-plugins-that-made-my-terminal-actually-enjoyable-71b45db34c54
- url
- https://medium.com/the-software-journal/8-zsh-plugins-that-made-my-terminal-actually-enjoyable-71b45db34c54
- canonical_url
- https://medium.com/the-software-journal/8-zsh-plugins-that-made-my-terminal-actually-enjoyable-71b45db34c54
- author_url
- https://medium.com/@aashish-k
- status
- ok
- fetched_at
- 2026-06-14 11:28:49