# ============================================================================ # Shared Utility Functions for Zsh Dotfiles # ============================================================================ # Common helper functions used across multiple function files. # # This file sources config.zsh (which sources dotfiles.conf) and colors.zsh, # so sourcing this single file gives you access to everything. # # Source this file in function files: # source "${0:A:h}/../lib/utils.zsh" # ============================================================================ # Prevent double-sourcing [[ -n "$_DF_UTILS_LOADED" ]] && return 0 typeset -g _DF_UTILS_LOADED=1 # ============================================================================ # Source Configuration and Colors # ============================================================================ # Order matters: config first (sets DF_WIDTH, etc.), then colors # Find lib directory _df_lib_dir="${0:A:h}" [[ ! -d "$_df_lib_dir" ]] && _df_lib_dir="$HOME/.dotfiles/zsh/lib" # Source config (provides all settings from dotfiles.conf) source "${_df_lib_dir}/config.zsh" 2>/dev/null || \ source "$HOME/.dotfiles/zsh/lib/config.zsh" 2>/dev/null || { # Fallback: set critical defaults if config.zsh not found typeset -g DOTFILES_DIR="${DOTFILES_DIR:-$HOME/.dotfiles}" typeset -g DOTFILES_HOME="${DOTFILES_HOME:-$DOTFILES_DIR}" typeset -g DOTFILES_VERSION="${DOTFILES_VERSION:-unknown}" typeset -g DF_WIDTH="${DF_WIDTH:-66}" } # Source colors source "${_df_lib_dir}/colors.zsh" 2>/dev/null || \ source "$HOME/.dotfiles/zsh/lib/colors.zsh" 2>/dev/null || { # Fallback colors if colors.zsh not found typeset -g DF_RED=$'\033[0;31m' DF_GREEN=$'\033[0;32m' DF_YELLOW=$'\033[1;33m' typeset -g DF_BLUE=$'\033[0;34m' DF_CYAN=$'\033[0;36m' DF_NC=$'\033[0m' typeset -g DF_GREY=$'\033[38;5;242m' DF_LIGHT_BLUE=$'\033[38;5;39m' typeset -g DF_LIGHT_GREEN=$'\033[38;5;82m' DF_BOLD=$'\033[1m' DF_DIM=$'\033[2m' } unset _df_lib_dir # ============================================================================ # MOTD-Style Header Functions # ============================================================================ # Prints a standardized header box for functions # Usage: df_print_func_name "Function Name" df_print_func_name() { local func_name="${1:-func}" local datetime=$(date '+%a %b %d %H:%M') local width="${DF_WIDTH:-66}" # Build horizontal line local hline="" for ((i=0; i${DF_NC} $1"; } df_print_success() { echo -e "${DF_GREEN}✓${DF_NC} $1"; } df_print_error() { echo -e "${DF_RED}✗${DF_NC} $1" >&2; } df_print_warning() { echo -e "${DF_YELLOW}⚠${DF_NC} $1"; } df_print_info() { echo -e "${DF_CYAN}ℹ${DF_NC} $1"; } df_print_section() { echo -e "${DF_CYAN}$1:${DF_NC}"; } df_print_indent() { echo " $1"; } # ============================================================================ # Command Dependency Checking # ============================================================================ df_cmd_exists() { command -v "$1" &>/dev/null; } df_require_cmd() { local cmd="$1" local package="${2:-$1}" if ! command -v "$cmd" &>/dev/null; then df_print_error "$cmd not installed" echo "Install: sudo pacman -S $package" return 1 fi return 0 } # ============================================================================ # User Confirmation # ============================================================================ df_confirm() { local prompt="$1" read -q "REPLY?$prompt [y/N]: " echo [[ "$REPLY" =~ ^[Yy]$ ]] } df_confirm_warning() { df_print_warning "$1" df_confirm "Continue?" } # ============================================================================ # File/Directory Helpers # ============================================================================ df_in_git_repo() { git rev-parse --git-dir &>/dev/null 2>&1; } df_git_root() { git rev-parse --show-toplevel 2>/dev/null; } df_ensure_dir() { [[ ! -d "$1" ]] && mkdir -p "$1"; } df_ensure_file() { local file="$1" content="${2:-}" if [[ ! -f "$file" ]]; then df_ensure_dir "$(dirname "$file")" [[ -n "$content" ]] && echo "$content" > "$file" || touch "$file" fi } # ============================================================================ # Environment Checks # ============================================================================ df_in_tmux() { [[ -n "$TMUX" ]]; } df_is_btrfs() { [[ "$(df -T / 2>/dev/null | awk 'NR==2 {print $2}')" == "btrfs" ]]; } # ============================================================================ # FZF Helpers # ============================================================================ df_fzf_opts() { echo "--height=50% --layout=reverse --border=rounded"; }