Making Your Terminal More Productive With Z-Shell (ZSH)

When working with servers or command-line-based applications, we spend most of our time on the command line. A good-looking and productive terminal is better in many aspects than a GUI (Graphical User Interface) environment since the command line takes less time for most use cases. Today, we’ll look at some of the features that make a terminal cool and productive.

You can use the following steps on Ubuntu 20.04. If you are using a different operating system, your commands will likely differ. If you’re using Windows, you can choose between Cygwin, WSL, and Git Bash.

Prerequisites

Let’s upgrade the system and install some basic tools needed.

sudo apt update && sudo apt upgrade
sudo apt install build-essential curl wget git

Z-Shell (ZSH)

Zsh is an extended Bourne shell with many improvements, including some features of Bash and other shells.

Let’s install Z-Shell:

sudo apt install zsh

Make it our default shell for our terminal:

chsh -s $(which zsh)

Now restart the system and open the terminal again to be welcomed by ZSH. Unlike other shells like Bash, ZSH requires some initial configuration, so it asks for some configuration options the first time we start it and saves them in a file called .zshrc in the home directory (/home/user) where the user is the current system user.

For now, we’ll skip the manual work and get a head start with the default configuration. Press 2, and ZSH will populate the .zshrc file with some default options. We can change these later.  

The initial configuration setup can be run again as shown in the below image:

Oh-My-ZSH

Oh-My-ZSH is a community-driven, open-source framework to manage your ZSH configuration. It comes with many plugins and helpers. It can be installed with one single command as below.

Installation

sh -c "$(wget https://raw.github.com/ohmyzsh/ohmyzsh/master/tools/install.sh -O -)"

It’d take a backup of our existing .zshrc in a file zshrc.pre-oh-my-zsh, so whenever you uninstall it, the backup would be restored automatically.

Font

A good terminal needs some good fonts, we’d use Terminess nerd font to make our terminal look awesome, which can be downloaded here. Once downloaded, extract and move them to ~/.local/share/fonts to make them available for the current user or to /usr/share/fonts to be available for all the users.

tar -xvf Terminess.zip
mv *.ttf ~/.local/share/fonts 

Once the font is installed, it will look like:

Among all the things Oh-My-ZSH provides, 2 things are community favorites, plugins, and themes.

Theme

My go-to ZSH theme is powerlevel10k because it’s flexible, provides everything out of the box, and is easy to install with one command as shown below:

git clone --depth=1 https://github.com/romkatv/powerlevel10k.git ${ZSH_CUSTOM:-$HOME/.oh-my-zsh/custom}/themes/powerlevel10k

To set this theme in .zshrc:

Close the terminal and start it again. Powerlevel10k will welcome you with the initial setup, go through the setup with the options you want. You can run this setup again by executing the below command:

p10k configure

Tools and plugins we can’t live without

Plugins can be added to the plugins array in the .zshrc file. For all the plugins you want to use from the below list, add those to the plugins array in the .zshrc file like so:

ZSH-Syntax-Highlighting

This enables the highlighting of commands as you type and helps you catch syntax errors before you execute them:

As you can see, “ls” is in green but “lss” is in red.

Execute below command to install it:

git clone https://github.com/zsh-users/zsh-syntax-highlighting.git ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-syntax-highlighting

ZSH Autosuggestions

This suggests commands as you type based on your history:

The below command is how you can install it by cloning the git repo:

git clone https://github.com/zsh-users/zsh-autosuggestions ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-autosuggestions

ZSH Completions

For some extra Zsh completion scripts, execute below command

git clone https://github.com/zsh-users/zsh-completions ${ZSH_CUSTOM:=~/.oh-my-zsh/custom}/plugins/zsh-completions 

autojump

It’s a faster way of navigating the file system; it works by maintaining a database of directories you visit the most. More details can be found here.

sudo apt install autojump 

You can also use the plugin Z as an alternative if you’re not able to install autojump or for any other reason.

Internal Plugins

Some plugins come installed with oh-my-zsh, and they can be included directly in .zshrc file without any installation.

copyfile

It copies the content of a file to the clipboard.

copyfile test.txt

copypath

It copies the absolute path of the current directory to the clipboard.

copybuffer

This plugin copies the command that is currently typed in the command prompt to the clipboard. It works with the keyboard shortcut CTRL + o.

sudo

Sometimes, we forget to prefix a command with sudo, but that can be done in just a second with this plugin. When you hit the ESC key twice, it will prefix the command you’ve typed in the terminal with sudo.

web-search

This adds some aliases for searching with Google, Wikipedia, etc. For example, if you want to web-search with Google, you can execute the below command:

google oh my zsh

Doing so will open this search in Google:

More details can be found here.

Remember, you’d have to add each of these plugins in the .zshrc file as well. So, in the end, this is how the plugins array in .zshrc file should look like:

plugins=(
        zsh-autosuggestions
        zsh-syntax-highlighting
        zsh-completions
        autojump
        copyfile
        copydir
        copybuffer
        history
        dirhistory
        sudo
        web-search
        git
) 

You can add more plugins, like docker, heroku, kubectl, npm, jsontools, etc., if you’re a developer. There are plugins for system admins as well or for anything else you need. You can explore them here.

Enhancd

Enhancd is the next-gen method to navigate file system with cli. It works with a fuzzy finder, we’ll install it fzf for this purpose.

sudo apt install fzf

Enhancd can be installed with zplug plugin manager for Zsh, so first we’ll install zplug with the below command:

$ curl -sL --proto-redir -all,https https://raw.githubusercontent.com/zplug/installer/master/installer.zsh | zsh

Append the following to .zshrc:

source ~/.zplug/init.zsh
zplug load

Now close your terminal, open it again, and use zplug to install enhanced

zplug "b4b4r07/enhancd", use:init.sh

Aliases

As a developer, I need to execute git commands many times a day, typing each command every time is too cumbersome, so we can use aliases for them. Aliases need to be added .zshrc, and here’s how we can add them.

alias gs='git status'
alias ga='git add .'
alias gf='git fetch'
alias gr='git rebase'
alias gp='git push'
alias gd='git diff'
alias gc='git commit'
alias gh='git checkout'
alias gst='git stash'
alias gl='git log --oneline --graph'

You can add these anywhere in the .zshrc file.

Colorls

Another tool that makes you say wow is Colorls. This tool colorizes the output of the ls command. This is how it looks once you install it:

It works with Ruby, below is how you can install both Ruby and Colors:

sudo apt install ruby ruby-dev ruby-colorize
sudo gem install colorls

Now, restart your terminal and execute the command colors in your terminal to see the magic!

Bonus – We can add some aliases as well if we want the same output of Colorls when we execute the command ls. Note that we’re adding another alias for ls to make it available as well.

alias cl='ls'
alias ls='colorls'
alias la='colorls -a'
alias ll='colorls -l'
alias lla='colorls -la'

These are the tools and plugins I can’t live without now, Let me know if I’ve missed anything.

Automation

Do you wanna repeat this process again, if let’s say, you’ve bought a new laptop and want the same setup?

You can automate all of this if your answer is no, and that’s why I’ve created Project Automator. This project does a lot more than just setting up a terminal: it works with Arch Linux as of now but you can take the parts you need and make it work with almost any *nix system you like.

Explaining how it works is beyond the scope of this article, so I’ll have to leave you guys here to explore it on your own.

Conclusion

We need to perform many tasks on our systems, and using a GUI(Graphical User Interface) tool for a task can consume a lot of your time, especially if you repeat the same task on a daily basis like converting a media stream, setting up tools on a system, etc.

Using a command-line tool can save you a lot of time and you can automate repetitive tasks with scripting. It can be a great tool for your arsenal.

Comments

Leave a Reply

Your email address will not be published. Required fields are marked *