The Complete Magazine on Open Source

Customize Your Shell with Zsh and Oh-My-Zsh

SHARE
/ 253 0

Customising-Shell-visual

Discover the Z shell, a powerful scripting language, which is designed for interactive use.

Z shell (zsh) is a powerful interactive login shell and command interpreter for shell scripting. A big improvement over older shells, it has a lot of new features and the support of the Oh-My-Zsh framework that makes using the terminal fun.
Released in 1990, the zsh shell is fairly new compared to its older counterpart, the bash shell. Although more than a decade has passed since its release, it is still very popular among programmers and developers who use the command-line interface on a daily basis.

Why zsh is better than the rest
Most of what is mentioned below can probably be implemented or configured in the bash shell as well; however, it is much more powerful in the zsh shell.

Advanced tab completion
Tab completion in zsh supports the command line option for the auto completion of commands. Pressing the tab key twice enables the auto complete mode, and you can cycle through the options using the tab key.
You can also move through the files in a directory with the tab key.
Zsh has tab completion for the path of directories or files in the command line too.
Another great feature is that you can switch paths by using 1 to switch to the previous path, 2 to switch to the ‘previous, previous’ path and so on.

Real time highlighting and themeable prompts
To include real time highlighting, clone the zsh-syntax-highlighting repository from github (https://github.com/zsh-users/zsh-syntax-highlighting). This makes the command-line look stunning. In some terminals, existing commands are highlighted in green and those typed incorrectly are highlighted in red. Also, quoted text is highlighted in yellow. All this can be configured further according to your needs.
Prompts on zsh can be customised to be right-aligned, left-aligned or as multi-lined prompts.

Globbing
Wikipedia defines globbing as follows: “In computer programming, in particular in a UNIX-like environment, the term globbing is sometimes used to refer to pattern matching based on wildcard characters.” Shells before zsh also offered globbing; however, zsh offers extended globbing. Extra features can be enabled if the EXTENDEDGLOB option is set.
Here are some examples of the extended globbing offered by zsh. The ^ character is used to negate any pattern following it.

setopt EXTENDEDGLOB # Enables extended globbing in zsh.
ls *(.) # Displays all regular files.
ls -d ^*.c # Displays all directories and files that are not cpp files.
ls -d ^*.* # Displays directories and files that have no extension.
ls -d ^file # Displays everything in directory except file called file.
ls -d *.^c # Displays files with extensions except .c files.

An expression of the form <x-y> matches a range of integers. Also, files can be grouped in the search pattern.

% ls (foo|bar).*
bar.o foo.c foo.o
% ls *.(c|o|pro)
bar.o file.pro foo.c foo.o main.o q.c

To exclude a certain file from the search, the ‘’~’’ character can be used.

% ls *.c
foo.c foob.c bar.c
% ls *.c~bar.c
foo.c foob.c
% ls *.c~f*
bar.c

These and several more extended globbing features can help immensely while working through large directories

figure1_tabCompletion

Figure1 : Tab Completion for command options

Case insensitive matching
Zsh supports pattern matching that is independent of whether the letters of the alphabet are upper or lower case. Zsh first surfs through the directory to find a match, and if one does not exist, it carries out a case insensitive search for the file or directory.
Sharing of command history among running shells
Running shells share command history, thereby eradicating the difficulty of having to remember the commands you typed earlier in another shell.

figure2_tabCompletion

Figure 2 : Tab completion for files

Aliases
Aliases are used to abbreviate commands and command options that are used very often or for a combination of commands. Most other shells have aliases but zsh supports global aliases. These are aliases that are substituted anywhere in the line. Global aliases can be used to abbreviate frequently-typed usernames, hostnames, etc. Here are some examples of aliases:

alias -g mr=’rm’
alias -g TL=’| tail -10’
alias -g NUL=”> /dev/null 2>&1”
figure3_tabCompletion

Figure 3 : View previous paths

Installing zsh
To install zsh in Ubuntu or Debian-based distros, type the following:

sudo apt-get update && sudo apt-get install zsh # install zsh
chsh -s /bin/zsh # to make zsh your default shell

To install it on SUSE-based distros, type:

sudo zypper install zsh
finger yoda | grep zsh
figure4_zshrc

Figure 4 : ~/.zshrc file

Configuring zsh
The .zshrc file looks something like what is shown in Figure 4.
Add your own aliases for commands you use frequently.
Customising zsh with Oh-My-Zsh
Oh-My-Zsh is believed to be an open source community-driven framework for managing the zsh configuration. Although zsh is powerful in comparison to other shells, its main attraction is the themes, plugins and other features that come with it.
To install Oh-My-Zsh you need to clone the Oh-My-Zsh repository from Github (https://github.com/robbyrussell/oh-my-zsh). A wide range of themes are available so there is something for everybody.
To clone the repository from Github, use the following command. This installs Oh-My-Zsh in ~/.oh-my-zsh (a hidden directory in your home directory). The default path can be changed by setting the environment variable for zsh using export ZSH = /your/path

git clone https://github.com/robbyrussell/oh-my-zsh.git

To install Oh-My-Zsh via curl, type:

curl -L http://install.ohmyz.sh | sh

To install it via wget, type:

wget —no-check-certificate http://install.ohmyz.sh -O - | sh

To customise zsh, create a new zsh configuration, i.e., a ~/.zshrc file by copying any of the existing templates provided:

cp ~/.oh-my-zsh/templates/zshrc.zsh-template ~/.zshrc

Restart your zsh terminal to view the changes.
Plugins
To check out the numerous plugins offered in Oh-My-Zsh, you can go to the plugins directory in ~/.oh-my-zsh.
To enable these plugins, add them to the ~/.zshrc file and then source them.

cd ~/.oh-my-zsh
vim ~/.zshrc
source ~/.zshrc

If you want to install some plugin that is not present in the plugins directory, you can clone the plugin from Github or install it using wget or curl and then source the plugin.

figure5_zshrc

Figure 5 : Setting aliases in ~/.zshrc file

figure6_ohmyzsh

Figure 6 : Customised command prompt

Themes
To view the themes in zsh go to the themes/ directory. To change your theme, set ZSH_THEME in ~/.zshrc to the theme you desire and then source Oh-My-Zsh. If you do not want any theme enabled, set ZSH_THEME = “”. If you can’t decide on a theme, you can set ZSH_THEME = “”random””. This will change the theme every time you open a shell and you can decide upon the one that you find most suitable for your needs.
To make your own theme, copy any one of the existing themes from the themes/ directory to a new file with a “zsh-theme” extension and make your changes to that.
A customised theme is shown in Figure 6.
Here, the user name, represented by %n, has been set to the colour green and the computer name, represented by %m, has been set to the colour cyan. This is followed by the path represented by %d. The prompt variable then looks like this…

PROMPT=’ $fg[green]%n $fg[red]at $fg[cyan]%m--->$fg[yellow]%d: ‘

The prompt can be changed to incorporate spacing, and git states, battery charge, etc, by declaring functions that do the same.
For example, here, instead of printing the entire path including /home/darshana, we can define a function such that if PWD detects $HOME, it replaces the same with ““~””

function get_pwd() {
echo “${PWD/$HOME/~}”
}

To view the status of the current Git repository, the following code can be used:

function git_prompt_info() {
ref=$(git symbolic-ref HEAD 2> /dev/null) || return
echo “$(parse_git_dirty)$ZSH_THEME_GIT_PROMPT_PREFIX$(current_branch)$ZSH_THEME_GIT_PROMPT_SUFFIX”
}

Here, the following variables have been declared:

ZSH_THEME_GIT_PROMPT_PREFIX=”[git:”
ZSH_THEME_GIT_PROMPT_SUFFIX=”]$reset_color”
ZSH_THEME_GIT_PROMPT_DIRTY=”$fg[red]+”
ZSH_THEME_GIT_PROMPT_CLEAN=”$fg[green]”

In the first line of the git_prompt_info function, if the present repository is a Git repository, information is displayed; if not, it returns back. In the second line, the function provided by Oh-My-Zsh, called current_branch, returns the current branch and if the current branch has uncommitted changes, i.e., if it is ‘dirty’, then parse_git_dirty outputs the variable $ZSH_THEME_GIT_PROMPT_DIRTY. If it is ‘clean’, then it outputs $ZSH_THEME_GIT_PROMPT_CLEAN.
Finally, the prompt looks like this:

PROMPT=’ $fg[green]%n $fg[red]at $fg[cyan]%m $fg[yellow]$(get_pwd)$(git_prompt_info): ‘
figure7_ohmyzsh

Figure 7 : Command prompt with the get_pwd function

You can make your own theme with functions such as git_prompt_info, get_pwd and other user-defined functions, and then source the file. You can fork the Oh-My-Zsh project and add your themes on Github for everyone to use.

References
[1] http://www.pixelstech.net/article/1348854378-9-reasons-to-use-Zsh
[2] http://zsh.sourceforge.net/Intro/
[3] http://fendrich.se/blog/2012/09/28/no/
[4] https://github.com/robbyrussell/oh-my-zsh
[5] http://code.tutsplus.com/tutorials/how-to-customize-your-command-prompt–net-24083