Complete Linux Development Environment Setup: Zsh, Oh My Zsh, Powerlevel10k, uv, pnpm, Git SSH, and Custom Functions
Every time I installed a new operating system, I went on a spree to find the blogs that worked last time. So I decided to consolidate all that into one blog for me and anyone else like me.
Ready to supercharge your Linux terminal? This guide will walk you step-by-step through setting up a development environment using Zsh, Oh My Zsh, the Powerlevel10k theme, Nerd Fonts, uv (for Python), pnpm (for Node.js), NVM, Git SSH keys, and a collection of custom aliases and functions. Whether you’re on Ubuntu or Arch Linux, you’ll end up with a fast, beautiful terminal tailored for development.
Prerequisites
Before starting, make sure you have:
- A Linux distribution (Ubuntu 20.04+ or Arch Linux)
- Git installed
Step 1: Install Zsh
For Ubuntu/Debian:
sudo apt update
sudo apt install zsh
For Arch Linux:
sudo pacman -S zsh
Verify the installation:
zsh --version
Step 2: Change Shell
Check if zsh is available
chsh -l
If it is available then change your default shell to zsh
chsh -s /usr/bin/zsh
Logout and then login again.
echo $SHELL
# /usr/bin/zsh
Step 3: Install Fonts
Powerlevel10k requires a Font for proper icon display. Let’s install one:
For Ubuntu/Debian (Powerline Font):
# Install required packages
sudo apt-get install fonts-powerline
# clear cache if required
fc-cache
For Arch Linux:
I like to use getnf in arch linux to install fonts. Same powerline font may work here also but i have not tried it.
curl -fsSL https://raw.githubusercontent.com/getnf/getnf/main/install.sh | bash
or using aur helper
yay -S getnf
getnf
and then choose a font of you liking and install it.
#remove cache if required
fc-cache
Step 4: Install Oh My Zsh
Install Oh My Zsh using the official installer:
sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"
Step 5: Install Powerlevel10k Theme
Clone the Powerlevel10k theme repository:
git clone --depth=1 https://github.com/romkatv/powerlevel10k.git ${ZSH_CUSTOM:-$HOME/.oh-my-zsh/custom}/themes/powerlevel10k
Step 6: Configure Powerlevel10k
- Open your Zsh configuration file:
nano ~/.zshrc
- Change the theme line to:
ZSH_THEME="powerlevel10k/powerlevel10k"
- Save and reload the configuration:
source ~/.zshrc
- The Powerlevel10k configuration wizard will start automatically. Follow the prompts to customize your prompt. Here are some recommended settings:
- Character Set: Choose Unicode (supports all symbols)
- Prompt Style: Classic (more traditional) or Rainbow (more colorful)
- Show current time: Yes (useful for timing commands)
- Prompt flow: Concise (cleaner look)
- Enable transient prompt: Yes (clears previous prompt when scrolling)
- Instant prompt: Yes (faster startup)
If it does not start automatically
p10k configure
Step 7: Install Useful Plugins
Oh My Zsh comes with many plugins. Let’s add some popular ones. Edit your ~/.zshrc
:
plugins=(
git # adds [git shortcuts](https://github.com/ohmyzsh/ohmyzsh/tree/master/plugins/git)
zsh-autosuggestions
zsh-syntax-highlighting
)
Do not use a comma between plugins, i have done that ;)
Install Additional Plugins:
# Zsh Autosuggestions
git clone https://github.com/zsh-users/zsh-autosuggestions ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-autosuggestions
# Zsh Syntax Highlighting
git clone https://github.com/zsh-users/zsh-syntax-highlighting.git ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-syntax-highlighting
Step 8: Configure Your Terminal
For GNOME Terminal (Ubuntu):
- Open Terminal Preferences
- Go to your profile settings
- In the “Text” tab, change the font to new installed font.
- Set font size to 12-14 for optimal readability
fc-list #to see all installed fonts
For VS Code and Cursor Terminal:
Set the terminal font to DroidSansM Nerd Font Mono
or whatever font you installed. in your editor settings:
VS Code: Settings → Search “terminal font” → Set “Terminal › Integrated: Font Family” to DroidSansM Nerd Font Mono
Or add to your settings.json:
{
"terminal.integrated.fontFamily": "'DroidSansM Nerd Font Mono', monospace"
}
Step 9: Customize Your Configuration
Add these useful aliases and settings to your ~/.zshrc
:
alias ll='ls -la'
alias la='ls -A'
alias l='ls -CF'
alias ..='cd ..'
alias ...='cd ../..'
alias ....='cd ../../..'
# Git aliases
alias gs='git status'
alias gc='git commit -m'
alias gpf='git push --force'
# soft reset last commit
alias greset='git reset --soft HEAD~1'
# node pnpm aliases
alias npx='pnpx'
alias npm='pnpm'
alias dev='pnpm dev'
alias build='pnpm build'
# Docker aliases
alias d='docker'
alias dc='docker compose'
alias dps='docker ps'
alias dex='docker exec -it'
# Python aliases
alias py='python3'
alias pip='pip3'
alias svp='source .venv/bin/activate' # i use sv cli for svelte so no sv
alias venv='uv venv'
# System aliases
alias update='sudo apt update && sudo apt upgrade' # For Ubuntu
alias update='sudo pacman -Syu' # For Arch Linux
# Custom functions
function mkcd() {
mkdir -p "$1" && cd "$1"
}
# Extract any archive
# usage: extract <file>
# example: extract file.tar.gz
extract() {
if [ -f $1 ] ; then
case $1 in
*.tar.bz2) tar xjf $1 ;;
*.tar.gz) tar xzf $1 ;;
*.bz2) bunzip2 $1 ;;
*.rar) unrar e $1 ;;
*.gz) gunzip $1 ;;
*.tar) tar xf $1 ;;
*.tbz2) tar xjf $1 ;;
*.tgz) tar xzf $1 ;;
*.zip) unzip $1 ;;
*.Z) uncompress $1 ;;
*.7z) 7z x $1 ;;
*) echo "'$1' cannot be extracted via extract()" ;;
esac
else
echo "'$1' is not a valid file"
fi
}
Step 10: Install uv
and pnpm
Install uv:
curl -LsSf https://astral.sh/uv/install.sh | sh
Node and pnpm
# Download and install nvm:
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.3/install.sh | bash
# in lieu of restarting the shell
. "$HOME/.nvm/nvm.sh"
# Download and install Node.js. At this time this is the lts version
# Visit [Node.js site](https://nodejs.org/en/download) to check lts version:
nvm install 22
# Verify the Node.js version:
node -v # Should print "v22.17.0".
nvm current # Should print "v22.17.0".
# Download and install pnpm:
corepack enable pnpm
# Verify pnpm version:
pnpm -v
If for some reason you are still not able to execute pnpm or nvm Add this to ~/.zshrc
# NVM (Node Version Manager) configuration
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh" # This loads nvm
[ -s "$NVM_DIR/nvm.sh.lazy" ] && . "$NVM_DIR/nvm.sh.lazy" # This loads nvm lazily
[ -s "$NVM_DIR/bash_completion" ] && . "$NVM_DIR/bash_completion" # This loads nvm bash_completion
# pnpm configuration
export PNPM_HOME="$HOME/.local/share/pnpm"
Step 11: Git ssh key setup
Generate your ssh key
ssh-keygen -t ed25519 -C "farhan@farhana.li" # your email, this is not a valid email
eval `ssh-agent`
# Agent pid 1234
ssh-add ~/.ssh/id_ed25519
Add you public key to your github keys
cat ~/.ssh/id_ed25519.pub
For more info, visit GitHub SSH documentation.
Finally, you’re all done!
Performance Issues
If Zsh feels slow:
- Disable some plugins you don’t use
- Use the “instant prompt” feature of Powerlevel10k
- Consider using a lighter theme if needed
Remember: restarting terminal always helps.
Step 12: Final Configuration
After all installations, reload your configuration if necessary:
source ~/.zshrc