# ~/.zshrc # ============================================================================= # HELPER FUNCTIONS # ============================================================================= # Add a directory to PATH with existence check # Usage: add_to_path /path/to/add [prepend|append] add_to_path() { local dir="$1" local position="${2:-prepend}" if [[ -d "$dir" ]]; then case "$position" in prepend) export PATH="$dir:$PATH" ;; append) export PATH="$PATH:$dir" ;; *) echo "Warning: Unknown position '$position' for path '$dir'" >&2 return 1 ;; esac fi } # Source a file with existence and readability check (zsh-friendly) # Usage: source_file /path/to/file source_file() { local file="$1" if [[ -f "$file" && -r "$file" ]]; then source "$file" fi } # Eval the output of a command, silently skipping if it fails or produces nothing # Usage: eval_expr 'pyenv init -' eval_expr() { local cmd="$1" local output if output="$(eval "$cmd" 2>/dev/null)" && [[ -n "$output" ]]; then eval "$output" fi } # ============================================================================= # PATH EXTENSIONS # ============================================================================= # Define all path extensions in an array for easy management path_extensions=( "$HOME/bin" "$HOME/.local/bin" "$HOME/.rbenv/bin" "$HOME/.pyenv/bin" "$HOME/.cargo/bin" "$HOME/go/bin" "$HOME/scripts" ) # Apply add_to_path to each directory (prepend by default) for path_dir in "${path_extensions[@]}"; do add_to_path "$path_dir" prepend done # ============================================================================= # CONFIGURATION FILES TO SOURCE # ============================================================================= # Define files to source in an array for easy management source_files=( "$HOME/.env" "$HOME/.nvm/nvm.sh" "$HOME/.cargo/env" "${XDG_CACHE_HOME:-$HOME/.cache}/p10k-instant-prompt-${(%):-%n}.zsh" ) # Source zsh-compatible files (skip if missing, no warnings) for config_file in "${source_files[@]}"; do source_file "$config_file" done # ============================================================================= # EVAL EXPRESSIONS # ============================================================================= # Commands whose output should be eval'd (tool initializers, etc.) eval_expressions=( 'pyenv init -' ) for expr in "${eval_expressions[@]}"; do eval_expr "$expr" done # ============================================================================= # SHELL INITIALIZATION # ============================================================================= # Oh My Zsh installation export ZSH="$HOME/.oh-my-zsh" # Set theme ZSH_THEME="powerlevel10k/powerlevel10k" # Enable plugins plugins=( git gh sudo ssh ruby rust python node rsync nvm rbenv pyenv docker docker-compose zsh-autosuggestions zsh-syntax-highlighting zsh-interactive-cd zsh-navigation-tools ) # Add fpath custom completions [[ -d "$HOME/.zsh/completions" ]] && fpath=("$HOME/.zsh/completions" $fpath) # Load Oh My Zsh framework [[ -f "$ZSH/oh-my-zsh.sh" ]] && source "$ZSH/oh-my-zsh.sh" # Powerlevel10k configuration (must come after theme is set) [[ -f ~/.p10k.zsh ]] && source ~/.p10k.zsh # ============================================================================= # SHELL OPTIONS # ============================================================================= zsh_options=( appendhistory incappendhistory sharehistory histignoreall_dups histreduceblanks complete_in_word always_to_end prompt_percent prompt_subst auto_cd ) for opt in "${zsh_options[@]}"; do setopt "$opt" done # ============================================================================= # ALIASES AND FUNCTIONS # ============================================================================= # Please add your custom aliases and functions here or in: # - $ZSH_CUSTOM/aliases.zsh # - $ZSH_CUSTOM/functions.zsh alias arty="arty.sh" alias stacks="stacks.sh"