How to Customize ZSH

Get Started

I ripped the ZSH config from Manjaro because it's a beautiful config. It has a lot, yes, but you can remove the stuff you know you don't need, which is what I did over time. I finally got all the essentials and no longer depend on carrying around the folders around.

Clean $HOME

To move the location of your config files for ZSH, set the ZDOTDIR environment variable inside of "$HOME"/.zshenv. Add something like export ZDOTDIR=~/.config/zsh.

Note: It'll still look for .zshrc for all your settings.

Configure ZSH

This will wildly depend on a per-person basis. especially the keybindings. I will go over what you may want to set in sequential order because what you set above will affect the stuff below, like the XDG directories.

XDG Directories

XDG Directories are set via environment variables. These allow all compliant programs to know where to look for stuff. For example, config files reside in "$HOME"/.config. Some programs will already look for it, but some may also look for its XDG equivalent, XDG_CONFIG_HOME. Here is a list of what I think to be the most important XDG directories to explicitly set:

				# XDG Dirs
				export XDG_CONFIG_HOME="$HOME"/.config
				export XDG_CACHE_HOME="$HOME"/.cache
				export XDG_DATA_HOME="$HOME"/.local/share
				export XDG_DOCUMENTS_DIR="$HOME"/Documents
				export XDG_DOWNLOAD_DIR="$HOME"/Downloads
				export XDG_MUSIC_DIR="$HOME"/Downloads/Music
				export XDG_VIDEOS_DIR="$HOME"/Downloads/Videos
				export XDG_PICTURES_DIR="$HOME"/Photos

I listen to music and I have a script to play music. For the sake of "universality", I set the XDG directory for it, as you can see above. I also use pcmanfm in case I want to drag and drop files, so I also set the XDG directory for my photos folder as well.


In the past, I used my rc files in Bash and ZSH to store aliases, but it made the file very long and didn't allow me to use the aliases on multiple shells. The best way to deal with aliases is to store them in their own file and source it like so:

				. "$XDG_CONFIG_HOME"/zsh/aliases

This also makes a great transition to the next point.

Set Keybindings

Run cat > /dev/null to allow you to see the escape sequences of your key presses. For me, pressing the right arrow key will display ^[[C and Ctrl+left prints ^[[1;5D.

Inside your .zshrc, make a keybindings section like this:

				# Keybind Section
				bindkey -e
				bindkey '^[[H' beginning-of-line                        # Home
				bindkey "${terminfo[kend]}" end-of-line                 # End
				bindkey '^[[2~' overwrite-mode                          # Insert
				bindkey '^[[3~' delete-char                             # Delete
				bindkey '^[[C'  forward-char                            # Right
				bindkey '^[[D'  backward-char                           # Left
				bindkey '^[[5~' history-beginning-search-backward       # Page up
				bindkey '^[[6~' history-beginning-search-forward        # Page down
				bindkey '^[[1;5C' forward-word                          # Ctrl+Right
				bindkey '^[[1;5D' backward-word                         # Ctrl+Left
				bindkey '^H' backward-kill-word                         # Ctrl+Backspace
				bindkey '^[[Z' undo                                     # Shift+tab

Change the contents of this section according to your needs. For more information on keybindings, you may want to visit the Arch Wiki entry.

Essential Plugins


To have a pleasant experience using the terminal, ZSH's autocompletion plugin is essential. First, install zsh-syntax-highlighting, then source it in your .zshrc. Next, add the following:

				autoload -Uz compinit
				zstyle ':completion:*' matcher-list 'm:{a-zA-Z}={A-Za-z}'               # Case insensitive tab completion
				zstyle ':completion:*' rehash true                                      # automatically find new executables in path
				zstyle ':completion:*' accept-exact '*(N)'
				zstyle ':completion:*' use-cache on
				zstyle ':completion:*' cache-path $XDG_CACHE_HOME/zsh/zcompcache	# Where to save command list

Command Auto-predictor

Install zsh-history-substring-search and zsh-autosuggestions, then source it in your .zshrc.


This is purely aesthetic, but some eye candy will allow you to actually enjoy using something. To get Manjaro's ZSH prompt, include the following:

				# Enables colors
				autoload -Uz colors
				# Set Prompt
				setopt prompt_subst
				PROMPT="%B%{$fg[cyan]%}%(4~|%-1~/.../%2~|%~)%u%b >%{$fg[cyan]%}>%B%(?.%{$fg[cyan]%}.%{$fg[red]%})>%{$reset_color%}%b "
				RPROMPT="%{$fg[red]%} %(?..[%?])"


This should be enough to give you a good experience using ZSH and it should expose you to what you can do. Happy Computing!

PS: If you just want to rip my config, here it is.