← Back to list

8 Zsh Plugins That Made My Terminal Actually Enjoyable

I spent years fighting my shell. These plugins finally made it work with me.

Aashish in The Software Journal · 2026-04-17 04:40 · 0 claps · 6.7 min read
#terminal #zsh #developer-tools #programming #software-engineering
Open on Medium ↗
Wiki topics: 💻 · Programming

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

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:

  1. Install Oh My Zsh for the plugin management layer.
  2. Add zsh-autosuggestions and zsh-syntax-highlighting first — these two alone will change your daily experience.
  3. Install fzf and wire it up. Spend a day just using Ctrl+R.
  4. Add z or zoxide and stop manually navigating directories.
  5. Layer in you-should-use to actually internalize your aliases.
  6. Configure powerlevel10k last, 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