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
andgaa
- the aliases forgit add
&git add --all
gco
andgcb
- the aliases forgit checkout
&git checkout -b
gcmsg
- the alias forgit commit --message
gd
- the alias forgit diff
gl
- the alias forgit pull
gp
- the alias forgit push
gpsup
- the alias forgit push --set-upstream origin $(git_current_branch)
gst
- the alias forgit 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.
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.
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.
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.
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.