The Only 5 Zsh Plugins You Need

Zsh plugins allow you to customize and improve your Zsh shell experience. They either enhance the appearance of your shell or the functionality. However, if you search for "Zsh plugins" on the internet, you'll encounter a sea of Zsh plugins.

How do you know what plugins to install? In this article, I'll show you the only 5 Zsh plugins you need to become faster with the CLI.

By the way, I'm using these plugins with the oh-my-zsh framework. If you want to take your Mac terminal to the next level, check out iTerm2 + Oh-My-Zsh: Supercharge Your Mac Terminal.

1. Git Plugin

The first plugin is git, which comes pre-installed with oh-my-zsh. It provides useful aliases (or shortcuts) and a couple of useful functions.

Instead of typing long commands such as git push --set-upstream origin <branch>, for example, you can use the alias (shortcut) gpsup.

Typing one long command occasionally isn't a hassle. However, we interact with Git frequently as developers, and we spend a lot of time typing commands. That adds up in the long run, so why not save a few keystrokes?

The Git aliases I use most frequently are as follows:

  • ga and gaa - the aliases for git add & git add --all
  • gcoand gcb - the aliases for git checkout & git checkout -b
  • gcmsg - the alias for git commit --message
  • gd - the alias for git diff
  • gl - the alias for git pull
  • gp - the alias for git push
  • gpsup - the alias for git push --set-upstream origin $(git_current_branch)
  • gst - the alias for git status

However, you can see all the available aliases/shortcuts here.

In case you want to create custom aliases, you can do so by adding them in the .zshrc configuration file. Check out my .zshrc configuration file if you want to see my custom aliases.

2. Zsh-autosuggestions Plugin

You most likely write a considerable amount of commands in the terminal, and the chances are that you repeat most of them frequently.

The zsh-autosuggestions plugin provides an autocomplete functionality. It suggests commands based on your history of previous commands and completions. Completion means that it offers suggestions based on what the tab completion would suggest.

zsh-autosuggestions zsh plugin

The image illustrates an example suggestion. It's a handy plugin that helps you save keystrokes and, therefore, time.

There are a couple of ways to install it, but if you have oh-my-zsh installed, you can do it as follows:

  • Clone the plugin repository in the plugins folder of Zsh:
git clone https://github.com/zsh-users/zsh-autosuggestions ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-autosuggestions
  • Add the plugin in the .zshrc file:
plugins=(git zsh-autosuggestions)
  • Save the file and restart Zsh as follows:
source ~/.zshrc

You can check out the other installation processes in the plugin repository.

3. Zsh-syntax-highlighting Plugin

This plugin provides syntax highlighting for the commands you type in the terminal.

Without this plugin, the whole command is the same color - white. Not only does it look dull, but it's also more difficult to catch typos and other mistakes.

zsh-syntax-highlighting-plugin

With the syntax highlighting, the terminal looks better, and you can seamlessly differentiate between the different parts of the command. Looking at the above picture, we can agree that it looks much better.

There are a couple of ways to install it, but if you have oh-my-zsh installed, you can do it as follows:

  • Clone the plugin repository in the plugins folder of Zsh:
git clone https://github.com/zsh-users/zsh-syntax-highlighting.git ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-syntax-highlighting
  • Add the plugin in the .zshrc file:
plugins=(git zsh-autosuggestions zsh-syntax-highlighting)
  • Save the file and restart Zsh as follows:
source ~/.zshrc

You can check out the other installation processes in the plugin repository.

4. You-should-use Plugin

It's difficult to remember all the aliases/shortcuts from the Git plugin or the ones you set manually in .zshrc. That's where the you-should-use plugin comes in handy.

Whenever you use a command that has an alias, it will find the shortcut and display it in the terminal. It's handy, and it helps you memorize the shortcuts.

you-should-use zsh plugin

There are a couple of ways to install it, but if you have oh-my-zsh installed, you can do it as follows:

  • Clone the plugin repository in the plugins folder of Zsh:
git clone https://github.com/MichaelAquilina/zsh-you-should-use.git $ZSH_CUSTOM/plugins/you-should-use
  • Add the plugin in the .zshrc file:
plugins=(git zsh-autosuggestions zsh-syntax-highlighting you-should-use)
  • Save the file and restart Zsh as follows:
source ~/.zshrc

You can check out the other installation processes in the plugin repository.

5. Zsh-bat Plugin

If you use the cat command regularly, you'll love this plugin. The output from the cat command is pretty bleak, and it can be challenging to navigate it.

By the way, here are the Mac commands I use the most frequently.

So, the zsh-bat plugin replaces the cat command and gives you a better output. Instead of using the cat command, you'll use bat, which returns an output with syntax highlighting and Git integration.

zsh-bat plugin

Now the output is legible, and it also looks fantastic! You can install it in the usual way:

  • Clone the plugin repository in the plugins folder of Zsh:
git clone https://github.com/fdellwing/zsh-bat.git $ZSH_CUSTOM/plugins/zsh-bat
  • Add the plugin in the .zshrc file:
plugins=(git zsh-autosuggestions zsh-syntax-highlighting you-should-use zsh-bat)
  • Save the file and restart Zsh as follows:
source ~/.zshrc

Important mention: For this plugin to work, you must install bat on your machine.

Summary

These are the 5 plugins that make my life easier and make me more productive. They improve both the appearance and the functionality of your Zsh shell.

Keep the article handy because I'll occasionally update it to include new plugins I find.

My entire Zsh/oh-my-zsh configuration (.zshrc file) is available here.

Zsh Git Aliases (Shortcuts)

Alias Command
grt cd "$(git rev-parse --show-toplevel || echo .)"
ggpnp ggl && ggp
ggpur ggu
g git
ga git add
gaa git add --all
gapa git add --patch
gau git add --update
gav git add --verbose
gwip git add -A; git rm $(git ls-files --deleted) 2> /dev/null; git commit --no-verify --no-gpg-sign --message "--wip-- [skip ci]"
gam git am
gama git am --abort
gamc git am --continue
gamscp git am --show-current-patch
gams git am --skip
gap git apply
gapt git apply --3way
gbs git bisect
gbsb git bisect bad
gbsg git bisect good
gbsn git bisect new
gbso git bisect old
gbsr git bisect reset
gbss git bisect start
gbl git blame -w
gb git branch
gba git branch --all
gbd git branch --delete
gbD git branch --delete --force
gbgd LANG=C git branch --no-color -vv | grep ": gone\]" | awk '"'"'{print $1}'"'"' | xargs git branch -d
gbgD LANG=C git branch --no-color -vv | grep ": gone\]" | awk '"'"'{print $1}'"'"' | xargs git branch -D
gbm git branch --move
gbnm git branch --no-merged
gbr git branch --remote
ggsup git branch --set-upstream-to=origin/$(git_current_branch)
gbg LANG=C git branch -vv | grep ": gone\]"
gco git checkout
gcor git checkout --recurse-submodules
gcb git checkout -b
gcd git checkout $(git_develop_branch)
gcm git checkout $(git_main_branch)
gcp git cherry-pick
gcpa git cherry-pick --abort
gcpc git cherry-pick --continue
gclean git clean --interactive -d
gcl git clone --recurse-submodules
gccd git clone --recurse-submodules "$@" && cd "$(basename $\_ .git)"
gcam git commit --all --message
gcas git commit --all --signoff
gcasm git commit --all --signoff --message
gcmsg git commit --message
gcsm git commit --signoff --message
gc git commit --verbose
gca git commit --verbose --all
gca! git commit --verbose --all --amend
gcan! git commit --verbose --all --no-edit --amend
gcans! git commit --verbose --all --signoff --no-edit --amend
gc! git commit --verbose --amend
gcn! git commit --verbose --no-edit --amend
gcs git commit -S
gcss git commit -S -s
gcssm git commit -S -s -m
gcf git config --list
gdct git describe --tags $(git rev-list --tags --max-count=1)
gd git diff
gdca git diff --cached
gdcw git diff --cached --word-diff
gds git diff --staged
gdw git diff --word-diff
gdv git diff -w "$@" | view -
gdup git diff @{upstream}
gdnolock git diff $@ ":(exclude)package-lock.json" ":(exclude)\*.lock"
gdt git diff-tree --no-commit-id --name-only -r
gf git fetch
gfa git fetch --all --prune
gfo git fetch origin
gg git gui citool
gga git gui citool --amend
ghh git help
glgg git log --graph
glgga git log --graph --decorate --all
glgm git log --graph --max-count=10
glod git log --graph --pretty='%Cred%h%Creset -%C(auto)%d%Creset %s %Cgreen(%ad) %C(bold blue)<%an>%Creset'
glods git log --graph --pretty='%Cred%h%Creset -%C(auto)%d%Creset %s %Cgreen(%ad) %C(bold blue)<%an>%Creset' --date=short
glol git log --graph --pretty='%Cred%h%Creset -%C(auto)%d%Creset %s %Cgreen(%ar) %C(bold blue)<%an>%Creset'
glola git log --graph --pretty='%Cred%h%Creset -%C(auto)%d%Creset %s %Cgreen(%ar) %C(bold blue)<%an>%Creset' --all
glols git log --graph --pretty='%Cred%h%Creset -%C(auto)%d%Creset %s %Cgreen(%ar) %C(bold blue)<%an>%Creset' --stat
glo git log --oneline --decorate
glog git log --oneline --decorate --graph
gloga git log --oneline --decorate --graph --all
glp git log --pretty=<format>
glg git log --stat
glgp git log --stat --patch
gignored git ls-files -v | grep "^[[:lower:]]"
gfg git ls-files | grep
gm git merge
gma git merge --abort
gms git merge --squash
gmom git merge origin/$(git_main_branch)
gmum git merge upstream/$(git_main_branch)
gmtl git mergetool --no-prompt
gmtlvim git mergetool --no-prompt --tool=vimdiff
gl git pull
gpr git pull --rebase
gprv git pull --rebase -v
gpra git pull --rebase --autostash
gprav git pull --rebase --autostash -v
gprom git pull --rebase origin $(git_main_branch)
gpromi git pull --rebase=interactive origin $(git_main_branch)
ggpull git pull origin "$(git_current_branch)"
ggl git pull origin $(current_branch)
gluc git pull upstream $(git_current_branch)
glum git pull upstream $(git_main_branch)
gp git push
gpd git push --dry-run
gpf! git push --force
ggf git push --force origin $(current_branch)
gpf On Git >= 2.30: git push --force-with-lease --force-if-includes
gpf On Git < 2.30: git push --force-with-lease
ggfl git push --force-with-lease origin $(current_branch)
gpsup git push --set-upstream origin $(git_current_branch)
gpsupf On Git >= 2.30: git push --set-upstream origin $(git_current_branch) --force-with-lease --force-if-includes
gpsupf On Git < 2.30: git push --set-upstream origin $(git_current_branch) --force-with-lease
gpv git push --verbose
gpoat git push origin --all && git push origin --tags
gpod git push origin --delete
ggpush git push origin "$(git_current_branch)"
ggp git push origin $(current_branch)
gpu git push upstream
grb git rebase
grba git rebase --abort
grbc git rebase --continue
grbi git rebase --interactive
grbo git rebase --onto
grbs git rebase --skip
grbd git rebase $(git_develop_branch)
grbm git rebase $(git_main_branch)
grbom git rebase origin/$(git_main_branch)
gr git remote
grv git remote --verbose
gra git remote add
grrm git remote remove
grmv git remote rename
grset git remote set-url
grup git remote update
grh git reset
gru git reset --
grhh git reset --hard
grhk git reset --keep
grhs git reset --soft
gpristine git reset --hard && git clean -dffx
groh git reset origin/$(git_current_branch) --hard
grs git restore
grss git restore --source
grst git restore --staged
gunwip git rev-list --max-count=1 --format="%s" HEAD | grep -q "--wip--" && git reset HEAD~1
grev git revert
grm git rm
grmc git rm --cached
gcount git shortlog --summary -n
gsh git show
gsps git show --pretty=short --show-signature
gstall git stash --all
gstu git stash --include-untracked
gstaa git stash apply
gstc git stash clear
gstd git stash drop
gstl git stash list
gstp git stash pop
gsta On Git >= 2.13: git stash push
gsta On Git < 2.13: git stash save
gsts git stash show --patch
gst git status
gss git status --short
gsb git status --short -b
gsi git submodule init
gsu git submodule update
gsd git svn dcommit
git-svn-dcommit-push git svn dcommit && git push github $(git_main_branch):svntrunk
gsr git svn rebase
gsw git switch
gswc git switch -c
gswd git switch $(git_develop_branch)
gswm git switch $(git_main_branch)
gta git tag --annotate
gts git tag -s
gtv git tag | sort -V
gignore git update-index --assume-unchanged
gunignore git update-index --no-assume-unchanged
gwch git whatchanged -p --abbrev-commit --pretty=medium
gwt git worktree
gwtls git worktree list
gwtmv git worktree move
gwtrm git worktree remove
gk gitk --all --branches &!
gke gitk --all $(git log --walk-reflogs --pretty=%h) &!
gtl gtl(){ git tag --sort=-v:refname -n --list ${1}\* }; noglob gtl

Source: oh-my-zsh git repository

If you use the default Mac terminal, check out this article that helps you improve your terminal with oh-my-zsh and iTerm2.