My Terminal Setup with Zsh and Oh My Zsh
My full Zsh configuration for a clean, fast, and productive terminal on macOS. This covers Oh My Zsh, the Pure prompt, version managers, and custom aliases.
Prerequisites
Install the following with Homebrew:
brew install pure zsh-syntax-highlighting zsh-autosuggestions pyenv rbenv
Install Oh My Zsh:
sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"
Install NVM:
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.3/install.sh | bash
Login Shell — .zprofile
The .zprofile runs once per login session and sets up Homebrew, NVM, and rbenv.
eval "$(/opt/homebrew/bin/brew shellenv)"
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # This loads nvm
# Ruby version manager
export PATH="$HOME/.rbenv/bin:$PATH"
eval "$(rbenv init -)"
Interactive Shell — .zshrc
The .zshrc runs on every new terminal window.
# Oh My Zsh
export ZSH="$HOME/.oh-my-zsh"
ZSH_THEME=""
zstyle ':omz:update' mode reminder
plugins=(
git
brew
common-aliases
z
colored-man-pages
colorize
zsh-syntax-highlighting
zsh-autosuggestions
)
source $ZSH/oh-my-zsh.sh
# Pure prompt
autoload -U promptinit; promptinit
prompt pure
# Python version manager
export PYENV_ROOT="$HOME/.pyenv"
[[ -d $PYENV_ROOT/bin ]] && export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init - zsh)"
# Additional PATH
. "$HOME/.local/bin/env"
export PATH="$HOME/bin:$PATH"
# Aliases
source ~/myaliases.zsh
Plugins
| Plugin | What it does |
|---|---|
git | Git aliases like gaa, gc, gco, gd, gl, gp |
brew | Homebrew completions and aliases |
common-aliases | Shortcuts like ll, la, l |
z | Jump to frequently used directories by partial name |
colored-man-pages | Syntax-highlighted man pages |
colorize | Syntax highlighting for file contents |
zsh-syntax-highlighting | Highlights commands as you type |
zsh-autosuggestions | Suggests commands from history as you type |
Theme — Pure
Pure is a minimal and fast Zsh prompt. ZSH_THEME is set to empty because Pure uses Zsh's built-in promptinit system instead of Oh My Zsh's theme engine.
Version Managers
- pyenv — manages Python versions, initialized in
.zshrc - rbenv — manages Ruby versions, initialized in
.zprofile - nvm — manages Node.js versions, initialized in
.zprofile
Custom Aliases — myaliases.zsh
The myaliases.zsh file is sourced at the end of .zshrc.
General
alias c='clear'
alias ..='cd ..'
alias ...='cd ../..'
alias h='history'
alias q='exit'
alias o='open .' # Open current folder in Finder
Network & Ports
po() { lsof -i :"$1" } # Find what's running on a port: po 3000
kp() { kill $(lsof -t -i:"$1") 2>/dev/null || kill -9 $(lsof -t -i:"$1") } # Kill process on a port
Process Helpers
alias procs='ps aux | sort -nr -k 3 | head -20' # Top 20 CPU processes
alias memprocs='ps aux | sort -nr -k 4 | head -20' # Top 20 memory processes
psg() { ps aux | grep -i "$1" | grep -v grep } # Search processes
Git
The git plugin provides most aliases. These are the extras:
alias gs='git status'
alias gclean='git branch --merged | grep -v main | xargs git branch -d'
Docker
alias d='docker'
alias dc='docker compose'
alias dcu='docker compose up'
alias dcd='docker compose down'
alias dps='docker ps --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}"'
alias di='docker images'
alias dprune='docker system prune -af'
Node / npm / pnpm
alias nr='npm run'
alias ni='npm install'
alias nis='npm install --save'
alias nid='npm install --save-dev'
alias pr='pnpm run'
alias pi='pnpm install'
alias fixnode='rm -rf node_modules package-lock.json && npm install'
Utilities
alias logf='tail -f' # Follow a log file
alias big='du -ah . | sort -hr | head -50' # Top 50 biggest files
alias nads='find . -name "*.DS_Store" -type f -delete' # Remove .DS_Store files
alias cleanmac='sudo purge' # Clear macOS memory cache
alias serve='python3 -m http.server 8000' # Quick HTTP server
alias reload='source ~/.zshrc' # Reload shell config
Replicate This Setup
- Install the prerequisites.
- Download the config files (.zprofile, .zshrc, myaliases.zsh), place them in your home directory, and you're good to go:
cp .zprofile ~/.zprofile
cp .zshrc ~/.zshrc
cp myaliases.zsh ~/myaliases.zsh
- Reload the shell:
source ~/.zshrc