Photo by Gabriel Heinzer on Unsplash
Supercharge Your Terminal: Mastering Zsh with Powerlevel10k and Essential Plugins
Table of contents
- 1. Installing the Basics
- Install Zsh
- Install Oh My Zsh
- Install Powerlevel10k Theme
- 2. Powerlevel10k Instant Prompt
- Why Use It?
- 3. Plugins for Productivity
- Plugin Configuration in .zshrc:
- What Each Plugin Does:
- 4. Environment Variables
- Java Configuration:
- NVM (Node Version Manager):
- 5. Aliases for Efficiency
- Loading Aliases:
- Examples of Aliases:
- 6. Additional Integrations
- iTerm2 Integration:
- Backups and Reloading:
- 7. Customizing Powerlevel10k
- 8. Final Touches
- Clean Up Unused .env and .alias Files
- Restart Zsh
- Complete .zshrc file is added for reference
If you’re looking to supercharge your terminal, Zsh (Z shell) is one of the best tools you can use. Combined with Oh My Zsh, Powerlevel10k, and a suite of plugins, you can transform your terminal into a highly efficient, visually appealing, and powerful environment. In this guide, we’ll walk you through configuring and using everything defined in the sample .zshrc
file.
The file is written for Mac OS, some updates might be needed to support Linux OS
1. Installing the Basics
Install Zsh
Zsh is the default shell on macOS, but if it’s not installed, you can add it:
brew install zsh
Install Oh My Zsh
Oh My Zsh is a framework that makes managing Zsh configurations, themes, and plugins easy:
sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"
Install Powerlevel10k Theme
Powerlevel10k is a fast and highly customizable Zsh theme:
git clone --depth=1 https://github.com/romkatv/powerlevel10k.git $ZSH_CUSTOM/themes/powerlevel10k
Set the theme in your .zshrc
file:
ZSH_THEME="powerlevel10k/powerlevel10k"
After setting up, run:
p10k configure
This will help you customize the prompt with useful features like Git status, Python environments, and more.
2. Powerlevel10k Instant Prompt
The instant prompt ensures your terminal loads quickly by displaying the prompt even before .zshrc
finishes loading. Here’s the relevant configuration:
if [[ -r "${XDG_CACHE_HOME:-$HOME/.cache}/p10k-instant-prompt-${(%):-%n}.zsh" ]]; then
source "${XDG_CACHE_HOME:-$HOME/.cache}/p10k-instant-prompt-${(%):-%n}.zsh"
fi
# typeset -g POWERLEVEL9K_INSTANT_PROMPT=quiet
- The
quiet
option suppresses warnings about instant prompt issues.
Why Use It?
Speed: Terminal loads faster by delaying the execution of heavy tasks.
Customizability: You can still customize the full prompt via
p10k configure
.
3. Plugins for Productivity
Oh My Zsh supports plugins that extend the functionality of your terminal. Here are the plugins we’ve defined and how to use them:
Plugin Configuration in .zshrc
:
plugins=(
git
zsh-autosuggestions
zsh-syntax-highlighting
history
vscode
kubectl
)
What Each Plugin Does:
git: Adds helpful Git aliases and shortcuts:
gst
forgit status
gco
forgit checkout
zsh-autosuggestions: Suggests commands based on your history as you type.
- Use the
→
key to accept suggestions.
- Use the
zsh-syntax-highlighting: Highlights commands and flags to improve readability and catch errors.
history: Enhances your command history management.
history
shows past commands.
vscode: Provides shortcuts for opening files and projects in Visual Studio Code.
- Example:
code .
opens the current directory in VS Code.
- Example:
kubectl: Autocompletes and adds shortcuts for Kubernetes CLI commands.
- Example:
k get pods
instead ofkubectl get pods
.
- Example:
4. Environment Variables
Environment variables are crucial for customizing your development environment. Here’s how they’re configured:
Java Configuration:
export JAVA_HOME=$(/usr/libexec/java_home -v 17)
What It Does: Points tools like Maven or Gradle to Java version 17.
Usage: Run
echo $JAVA_HOME
to verify the Java path.
NVM (Node Version Manager):
if [ -d "$HOME/.nvm" ]; then
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && source "$NVM_DIR/nvm.sh"
fi
What It Does: Enables NVM to manage multiple Node.js versions.
Usage: Use
nvm install <version>
to install a specific version of Node.js.
5. Aliases for Efficiency
Aliases are shortcuts for commonly used commands. Here’s how they’re loaded and used:
Loading Aliases:
if [ -d "$HOME/.alias" ] && [ "$(ls -A $HOME/.alias)" ]; then
for file in $HOME/.alias/*.sh; do
[ -f "$file" ] && . "$file"
done
fi
Examples of Aliases:
alias ll="ls -la"
alias gs="git status"
alias gp="git pull"
alias vim="nvim"
Usage:
ll
: Lists all files with details.gs
: Runsgit status
.vim
: Opens Neovim instead of Vim.
6. Additional Integrations
iTerm2 Integration:
if [ -e "$HOME/.iterm2_shell_integration.zsh" ]; then
source "$HOME/.iterm2_shell_integration.zsh"
fi
- What It Does: Enhances iTerm2 with features like split panes and session restoration.
Backups and Reloading:
alias backup-zshrc="cp ~/.zshrc ~/.zshrc.backup && echo 'Backup created at ~/.zshrc.backup'"
alias update-zsh="source ~/.zshrc && echo 'Reloaded .zshrc settings'"
Usage:
backup-zshrc
: Creates a backup of your.zshrc
file.update-zsh
: Reloads.zshrc
after making changes.
7. Customizing Powerlevel10k
You can customize Powerlevel10k using the following command:
p10k configure
This wizard allows you to set:
Prompt layout (e.g., minimal, classic).
Colors, icons, and separators.
Display options (e.g., Git branch, time, battery level).
If you want to tweak configurations manually, edit ~/.p10k.zsh
.
8. Final Touches
Clean Up Unused .env
and .alias
Files
Ensure there are no unnecessary files in ~/.env
and ~/.alias
. Only include variables and aliases you actively use.
Restart Zsh
After making changes, reload your shell:
source ~/.zshrc
By following these steps, you’ll have a Zsh terminal that’s not only beautiful but also optimized for productivity.
Complete .zshrc
file is added for reference
# Enable Powerlevel10k instant prompt. Should stay close to the top of ~/.zshrc.
if [[ -r "${XDG_CACHE_HOME:-$HOME/.cache}/p10k-instant-prompt-${(%):-%n}.zsh" ]]; then
source "${XDG_CACHE_HOME:-$HOME/.cache}/p10k-instant-prompt-${(%):-%n}.zsh"
fi
# Suppress Powerlevel10k instant prompt warnings
# typeset -g POWERLEVEL9K_INSTANT_PROMPT=quiet
# Path to your oh-my-zsh installation
export ZSH="$HOME/.oh-my-zsh"
# Theme
ZSH_THEME="powerlevel10k/powerlevel10k"
# Enable command auto-correction
ENABLE_CORRECTION="true"
# Display red dots whilst waiting for completion
COMPLETION_WAITING_DOTS="true"
# Plugins
plugins=(
git
zsh-autosuggestions
zsh-syntax-highlighting
history
vscode
kubectl
)
# Load Oh My Zsh
source $ZSH/oh-my-zsh.sh
# Custom Settings
# Java Home
export JAVA_HOME=$(/usr/libexec/java_home -v 17)
# Vim Keybindings
bindkey -v
# Load Environment Variables from `.env` Directory
if [ -d "$HOME/.env" ] && [ "$(ls -A $HOME/.env)" ]; then
for file in $HOME/.env/*.env; do
[ -f "$file" ] && . "$file"
done
fi
# Load Aliases from `.alias` Directory
if [ -d "$HOME/.alias" ] && [ "$(ls -A $HOME/.alias)" ]; then
for file in $HOME/.alias/*.sh; do
[ -f "$file" ] && . "$file"
done
fi
# Additional Path Updates (already moved to system-paths.env)
export PATH="$PATH"
# Enable NVM (Node Version Manager)
if [ -d "$HOME/.nvm" ]; then
export NVM_DIR="$HOME/.nvm"
if [ -s "$NVM_DIR/nvm.sh" ]; then
source "$NVM_DIR/nvm.sh"
fi
fi
# iTerm2 Shell Integration
if [ -e "$HOME/.iterm2_shell_integration.zsh" ]; then
source "$HOME/.iterm2_shell_integration.zsh"
fi
# Backup and Update Aliases
alias backup-zshrc="cp ~/.zshrc ~/.zshrc.backup && echo 'Backup created at ~/.zshrc.backup'"
alias update-zsh="source ~/.zshrc && echo 'Reloaded .zshrc settings'"
# To customize prompt, run `p10k configure` or edit ~/.p10k.zsh.
[[ ! -f ~/.p10k.zsh ]] || source ~/.p10k.zsh