Pure - Minimal Zsh Prompt
Pure is a pretty, minimal, and fast Zsh prompt that focuses on simplicity and performance. Created by Sindre Sorhus, Pure emphasizes clean aesthetics, asynchronous Git information fetching, and intelligent display of only relevant information. It represents the minimalist philosophy in prompt design while maintaining essential functionality for modern development workflows.
Installation
Prerequisites
# Ensure Zsh is installed and set as default shell
zsh --version
echo $SHELL
# Set Zsh as default shell if needed
chsh -s $(which zsh)
# Verify Zsh configuration
echo $ZSH_VERSION
Installation Methods
npm Installation (Recommended)
# Install via npm
npm install --global pure-prompt
# Verify installation
which pure
# Check version
pure --version
Manual Installation
# Clone repository
mkdir -p "$HOME/.zsh"
git clone https://github.com/sindresorhus/pure.git "$HOME/.zsh/pure"
# Add to .zshrc
echo 'fpath+=$HOME/.zsh/pure' >> ~/.zshrc
echo 'autoload -U promptinit; promptinit' >> ~/.zshrc
echo 'prompt pure' >> ~/.zshrc
# Reload configuration
source ~/.zshrc
Package Manager Installation
# Homebrew (macOS)
brew install pure
# Add to .zshrc
echo 'fpath+=/usr/local/share/zsh/site-functions' >> ~/.zshrc
echo 'autoload -U promptinit; promptinit' >> ~/.zshrc
echo 'prompt pure' >> ~/.zshrc
# Arch Linux
yay -S zsh-pure-prompt
# Gentoo
emerge app-shells/pure
# FreeBSD
pkg install zsh-pure
Oh My Zsh Integration
# Clone to Oh My Zsh custom themes
git clone https://github.com/sindresorhus/pure.git "$ZSH_CUSTOM/themes/pure"
# Symlink pure.zsh-theme
ln -s "$ZSH_CUSTOM/themes/pure/pure.zsh-theme" "$ZSH_CUSTOM/themes/pure.zsh-theme"
# Set theme in .zshrc
ZSH_THEME="" # Disable Oh My Zsh themes
echo 'fpath+=$ZSH_CUSTOM/themes/pure' >> ~/.zshrc
echo 'autoload -U promptinit; promptinit' >> ~/.zshrc
echo 'prompt pure' >> ~/.zshrc
Zinit Plugin Manager
# Add to .zshrc
zinit ice compile'(pure|async).zsh' pick'async.zsh' src'pure.zsh'
zinit light sindresorhus/pure
# Alternative with Oh My Zsh compatibility
zinit ice pick'async.zsh' src'pure.zsh'
zinit light sindresorhus/pure
Antibody Plugin Manager
# Add to .zshrc
antibody bundle mafredri/zsh-async
antibody bundle sindresorhus/pure
# Or use antibody bundle file
echo 'mafredri/zsh-async' >> ~/.zsh_plugins.txt
echo 'sindresorhus/pure' >> ~/.zsh_plugins.txt
antibody bundle < ~/.zsh_plugins.txt > ~/.zsh_plugins.sh
source ~/.zsh_plugins.sh
Configuration
Basic Setup
# Add to .zshrc after Pure installation
autoload -U promptinit; promptinit
prompt pure
# Reload configuration
source ~/.zshrc
Color Customization
# Customize colors in .zshrc
# Available colors: black, red, green, yellow, blue, magenta, cyan, white
# Or use color codes: 0-255
# Prompt symbol color
zstyle ':prompt:pure:prompt:success' color green
zstyle ':prompt:pure:prompt:error' color red
# Path color
zstyle ':prompt:pure:path' color blue
# Git branch color
zstyle ':prompt:pure:git:branch' color cyan
# Git dirty state color
zstyle ':prompt:pure:git:dirty' color yellow
# Git stash color
zstyle ':prompt:pure:git:stash' color magenta
# Command execution time color
zstyle ':prompt:pure:execution_time' color yellow
# User and host color (when shown)
zstyle ':prompt:pure:user' color magenta
zstyle ':prompt:pure:host' color cyan
# Virtualenv color
zstyle ':prompt:pure:virtualenv' color yellow
Symbol Customization
# Customize symbols in .zshrc
# Prompt symbols
zstyle ':prompt:pure:prompt:success' symbol '❯'
zstyle ':prompt:pure:prompt:error' symbol '❯'
zstyle ':prompt:pure:prompt:continuation' symbol '…'
# Git symbols
zstyle ':prompt:pure:git:up_arrow' symbol '⇡'
zstyle ':prompt:pure:git:down_arrow' symbol '⇣'
zstyle ':prompt:pure:git:dirty' symbol '*'
zstyle ':prompt:pure:git:stash' symbol '≡'
# Alternative symbols
zstyle ':prompt:pure:prompt:success' symbol '→'
zstyle ':prompt:pure:prompt:error' symbol '✗'
zstyle ':prompt:pure:git:dirty' symbol '!'
zstyle ':prompt:pure:git:stash' symbol '
### Display Options
```bash
# Show/hide username and hostname
zstyle ':prompt:pure:user' show true
zstyle ':prompt:pure:host' show true
# Show username only when different from default
zstyle ':prompt:pure:user' show auto
# Show hostname only over SSH
zstyle ':prompt:pure:host' show auto
# Always show username and hostname
zstyle ':prompt:pure:user' show always
zstyle ':prompt:pure:host' show always
# Never show username and hostname
zstyle ':prompt:pure:user' show false
zstyle ':prompt:pure:host' show false
Git Configuration
# Git status display options
# Show Git stash count
zstyle ':prompt:pure:git:stash' show true
# Hide Git stash count
zstyle ':prompt:pure:git:stash' show false
# Show dirty state immediately (no async)
zstyle ':prompt:pure:git:dirty' check true
# Disable dirty state checking for performance
zstyle ':prompt:pure:git:dirty' check false
# Set Git status fetch timeout (seconds)
zstyle ':prompt:pure:git:fetch' timeout 5
Execution Time Display
# Show command execution time threshold (seconds)
zstyle ':prompt:pure:execution_time' threshold 2
# Disable execution time display
zstyle ':prompt:pure:execution_time' show false
# Always show execution time
zstyle ':prompt:pure:execution_time' show true
# Custom execution time format
zstyle ':prompt:pure:execution_time' format '%d:%02d:%02d'
Path Display
# Maximum path segments to show
zstyle ':prompt:pure:path' max_dirs 2
# Show full path
zstyle ':prompt:pure:path' max_dirs 0
# Path truncation symbol
zstyle ':prompt:pure:path' truncation '…'
# Disable path truncation
zstyle ':prompt:pure:path' truncation ''
Advanced Configuration
Conditional Display
# Show user@host only in specific conditions
# SSH connections
if [[ -n $SSH_CONNECTION ]]; then
zstyle ':prompt:pure:user' show true
zstyle ':prompt:pure:host' show true
else
zstyle ':prompt:pure:user' show false
zstyle ':prompt:pure:host' show false
fi
# Root user detection
if [[ $UID -eq 0 ]]; then
zstyle ':prompt:pure:user' show true
zstyle ':prompt:pure:prompt:success' color red
fi
# Different environments
case $HOST in
production-*)
zstyle ':prompt:pure:host' show true
zstyle ':prompt:pure:host' color red
;;
staging-*)
zstyle ':prompt:pure:host' show true
zstyle ':prompt:pure:host' color yellow
;;
development-*)
zstyle ':prompt:pure:host' show true
zstyle ':prompt:pure:host' color green
;;
esac
Custom Hooks
# Pre-command hook
pure_preexec() \{
# Custom logic before command execution
echo "Executing: $1"
\}
# Post-command hook
pure_precmd() \{
# Custom logic after command execution
# This runs before prompt is displayed
\}
# Add hooks to precmd and preexec arrays
precmd_functions+=(pure_precmd)
preexec_functions+=(pure_preexec)
Integration with Other Tools
# Virtualenv integration
# Pure automatically detects and displays Python virtual environments
# Customize virtualenv display
zstyle ':prompt:pure:virtualenv' color cyan
zstyle ':prompt:pure:virtualenv' format '[%s]'
# Node.js version display (custom)
pure_node_version() \{
if [[ -f package.json ]]; then
local node_version=$(node --version 2>/dev/null)
if [[ -n $node_version ]]; then
echo " node:$node_version"
fi
fi
\}
# Add to prompt
RPROMPT='$(pure_node_version)'
Performance Optimization
# Disable expensive Git operations
zstyle ':prompt:pure:git:fetch' timeout 1
zstyle ':prompt:pure:git:dirty' check false
# Reduce Git status checking frequency
zstyle ':prompt:pure:git:fetch' interval 60
# Disable async Git status for very large repositories
zstyle ':prompt:pure:git:async' enable false
Customization Examples
Minimal Configuration
# Ultra-minimal Pure setup
autoload -U promptinit; promptinit
prompt pure
# Hide everything except path and prompt
zstyle ':prompt:pure:user' show false
zstyle ':prompt:pure:host' show false
zstyle ':prompt:pure:git:stash' show false
zstyle ':prompt:pure:execution_time' show false
# Simple symbols
zstyle ':prompt:pure:prompt:success' symbol '>'
zstyle ':prompt:pure:prompt:error' symbol '>'
zstyle ':prompt:pure:git:dirty' symbol '*'
Developer-Focused Configuration
# Developer-optimized Pure setup
autoload -U promptinit; promptinit
prompt pure
# Show execution time for performance monitoring
zstyle ':prompt:pure:execution_time' threshold 1
zstyle ':prompt:pure:execution_time' color yellow
# Enhanced Git information
zstyle ':prompt:pure:git:stash' show true
zstyle ':prompt:pure:git:dirty' check true
zstyle ':prompt:pure:git:branch' color cyan
zstyle ':prompt:pure:git:dirty' color red
# Show user@host for context
zstyle ':prompt:pure:user' show auto
zstyle ':prompt:pure:host' show auto
# Custom symbols for better visibility
zstyle ':prompt:pure:prompt:success' symbol '❯'
zstyle ':prompt:pure:prompt:error' symbol '❯'
zstyle ':prompt:pure:git:up_arrow' symbol '↑'
zstyle ':prompt:pure:git:down_arrow' symbol '↓'
Production Environment Configuration
# Production-safe Pure configuration
autoload -U promptinit; promptinit
prompt pure
# Always show user@host for security awareness
zstyle ':prompt:pure:user' show true
zstyle ':prompt:pure:host' show true
zstyle ':prompt:pure:user' color red
zstyle ':prompt:pure:host' color red
# Prominent error indication
zstyle ':prompt:pure:prompt:error' color red
zstyle ':prompt:pure:prompt:error' symbol '✗'
# Show execution time for audit trails
zstyle ':prompt:pure:execution_time' threshold 0
zstyle ':prompt:pure:execution_time' color yellow
# Conservative Git settings
zstyle ':prompt:pure:git:fetch' timeout 10
zstyle ':prompt:pure:git:dirty' check true
Multi-line Configuration
# Multi-line Pure prompt
autoload -U promptinit; promptinit
prompt pure
# Custom prompt function for multi-line
pure_setup_multiline() \{
# First line: path and git info
PROMPT='%F\{blue\}%~%f$(pure_git_info)
%F\{magenta\}❯%f '
# Right prompt: execution time and virtualenv
RPROMPT='$(pure_execution_time)$(pure_virtualenv)'
\}
# Override Pure's prompt setup
pure_setup_multiline
Integration with Development Tools
Git Integration
# Enhanced Git status display
zstyle ':prompt:pure:git:stash' show true
zstyle ':prompt:pure:git:dirty' check true
# Git aliases that work well with Pure
alias gs='git status --short'
alias gd='git diff'
alias gl='git log --oneline -10'
alias gb='git branch -v'
# Git hooks for Pure optimization
# .git/hooks/post-checkout
#!/bin/sh
# Trigger Pure Git status refresh
kill -USR1 $
Docker Integration
# Docker context display (custom addition)
pure_docker_context() \{
if command -v docker >/dev/null 2>&1; then
local context=$(docker context show 2>/dev/null)
if [[ $context != "default" ]]; then
echo " docker:$context"
fi
fi
\}
# Add to right prompt
RPROMPT='$(pure_docker_context)$RPROMPT'
Kubernetes Integration
# Kubernetes context display (custom addition)
pure_k8s_context() \{
if command -v kubectl >/dev/null 2>&1; then
local context=$(kubectl config current-context 2>/dev/null)
local namespace=$(kubectl config view --minify --output 'jsonpath=\{..namespace\}' 2>/dev/null)
if [[ -n $context ]]; then
echo " k8s:$context$\{namespace:+/$namespace\}"
fi
fi
\}
# Add to right prompt
RPROMPT='$(pure_k8s_context)$RPROMPT'
Python Virtual Environment
# Pure automatically detects virtual environments
# Customize virtualenv display
zstyle ':prompt:pure:virtualenv' color green
zstyle ':prompt:pure:virtualenv' format '(%s) '
# Conda environment support (custom)
pure_conda_env() \{
if [[ -n $CONDA_DEFAULT_ENV ]]; then
echo "($CONDA_DEFAULT_ENV) "
fi
\}
# Override virtualenv display to include Conda
PROMPT='$(pure_conda_env)$PROMPT'
Troubleshooting
Common Issues
# Pure not loading
# Check if promptinit is loaded
autoload -U promptinit; promptinit
# Verify Pure is available
prompt -l|grep pure
# Force reload Pure
prompt pure
# Check for conflicts with other prompt themes
# Disable Oh My Zsh themes
ZSH_THEME=""
# Clear existing prompt settings
unset PROMPT RPROMPT PS1 PS2
Performance Issues
# Disable expensive Git operations
zstyle ':prompt:pure:git:fetch' timeout 1
zstyle ':prompt:pure:git:dirty' check false
# Check for slow Git repositories
time git status
# Optimize Git configuration
git config --global core.preloadindex true
git config --global core.fscache true
git config --global gc.auto 256
# Profile Zsh startup
time zsh -i -c exit
Async Issues
# Check if async library is loaded
which async_init
# Reinstall async dependency
npm install --global pure-prompt
# Manual async installation
git clone https://github.com/mafredri/zsh-async.git ~/.zsh/async
echo 'source ~/.zsh/async/async.zsh' >> ~/.zshrc
Color Issues
# Check terminal color support
echo $TERM
tput colors
# Test color output
for i in \{0..255\}; do print -Pn "%F\{$i\}▇%f"; done; echo
# Reset color settings
zstyle -d ':prompt:pure:*' color
# Use basic colors for compatibility
zstyle ':prompt:pure:prompt:success' color green
zstyle ':prompt:pure:prompt:error' color red
zstyle ':prompt:pure:path' color blue
Best Practices
Configuration Management
# Keep Pure configuration in separate file
# ~/.config/pure/config.zsh
autoload -U promptinit; promptinit
prompt pure
# Color configuration
zstyle ':prompt:pure:prompt:success' color green
zstyle ':prompt:pure:prompt:error' color red
zstyle ':prompt:pure:path' color blue
zstyle ':prompt:pure:git:branch' color cyan
# Source from .zshrc
source ~/.config/pure/config.zsh
# Version control Pure configuration
git add ~/.config/pure/config.zsh
git commit -m "Add Pure prompt configuration"
Environment-Specific Settings
# Different settings for different environments
case $HOST in
work-*)
zstyle ':prompt:pure:user' show true
zstyle ':prompt:pure:host' show true
zstyle ':prompt:pure:execution_time' threshold 1
;;
personal-*)
zstyle ':prompt:pure:user' show false
zstyle ':prompt:pure:host' show false
zstyle ':prompt:pure:execution_time' threshold 5
;;
esac
# SSH-specific configuration
if [[ -n $SSH_CONNECTION ]]; then
zstyle ':prompt:pure:user' show true
zstyle ':prompt:pure:host' show true
zstyle ':prompt:pure:host' color yellow
fi
Performance Guidelines
# Optimize for large repositories
if [[ $(git rev-list --count HEAD 2>/dev/null||echo 0) -gt 10000 ]]; then
zstyle ':prompt:pure:git:dirty' check false
zstyle ':prompt:pure:git:fetch' timeout 1
fi
# Conditional Git status checking
zstyle ':prompt:pure:git:dirty' check true
zstyle ':prompt:pure:git:fetch' timeout 3
# Minimal configuration for slow systems
zstyle ':prompt:pure:execution_time' show false
zstyle ':prompt:pure:git:stash' show false
Security Considerations
# Hide sensitive information in screenshots/recordings
zstyle ':prompt:pure:user' show false
zstyle ':prompt:pure:host' show false
# Show context in production environments
if [[ $HOST =~ "prod" ]]; then
zstyle ':prompt:pure:user' show true
zstyle ':prompt:pure:host' show true
zstyle ':prompt:pure:host' color red
fi
# Avoid displaying sensitive paths
zstyle ':prompt:pure:path' max_dirs 2
Pure represents the essence of minimalist prompt design, providing essential information without visual clutter. Its asynchronous Git status fetching, intelligent display logic, and extensive customization options make it an excellent choice for developers who value clean aesthetics and optimal performance. Whether you prefer the default minimal appearance or customize it extensively, Pure maintains its core philosophy of showing only what matters while staying fast and responsive.
```
Display Options
CODE_BLOCK_10
Git Configuration
CODE_BLOCK_11
Execution Time Display
CODE_BLOCK_12
Path Display
CODE_BLOCK_13
Advanced Configuration
Conditional Display
CODE_BLOCK_14
Custom Hooks
CODE_BLOCK_15
Integration with Other Tools
CODE_BLOCK_16
Performance Optimization
CODE_BLOCK_17
Customization Examples
Minimal Configuration
CODE_BLOCK_18
Developer-Focused Configuration
CODE_BLOCK_19
Production Environment Configuration
CODE_BLOCK_20
Multi-line Configuration
CODE_BLOCK_21
Integration with Development Tools
Git Integration
CODE_BLOCK_22
Docker Integration
CODE_BLOCK_23
Kubernetes Integration
CODE_BLOCK_24
Python Virtual Environment
CODE_BLOCK_25
Troubleshooting
Common Issues
CODE_BLOCK_26
Performance Issues
CODE_BLOCK_27
Async Issues
CODE_BLOCK_28
Color Issues
CODE_BLOCK_29
Best Practices
Configuration Management
CODE_BLOCK_30
Environment-Specific Settings
CODE_BLOCK_31
Performance Guidelines
CODE_BLOCK_32
Security Considerations
CODE_BLOCK_33
Pure represents the essence of minimalist prompt design, providing essential information without visual clutter. Its asynchronous Git status fetching, intelligent display logic, and extensive customization options make it an excellent choice for developers who value clean aesthetics and optimal performance. Whether you prefer the default minimal appearance or customize it extensively, Pure maintains its core philosophy of showing only what matters while staying fast and responsive.