diff --git a/config/zsh/.zprofile b/config/zsh/.zprofile index adbe1ff..cb8f469 100644 --- a/config/zsh/.zprofile +++ b/config/zsh/.zprofile @@ -31,12 +31,30 @@ have() { # [ "$(uname -s)" = "Darwin" ] && { PATH=""; source /etc/profile; } +# Prepend $2 to variable $1 using $3 as separator, but only if $2 is not already +# contained in $1. This is useful for prepending to PATH while avoiding +# duplicates. +prepend_unique() { + local var="$1" + local new="$2" + local sep="${3-:}" # Default separator is colon. + local old="${(P)var}" + + case "${sep}${old}${sep}" in + *"${sep}${new}${sep}"*) # Skip duplicate. + ;; + "${sep}${sep}") # Variable was empty, set without separator. + typeset -g $var="${new}" + ;; + *) # Prepend with separator. + typeset -g $var="${new}${sep}${old}" + ;; + esac +} + # Add custom bin dirs to PATH if they exist and are not already in PATH. while read -r dir; do - [ -d "$dir" ] && case ":${PATH:=$dir}:" in - *:"$dir":*) ;; # already in PATH -> ignore - *) PATH="$dir:$PATH" ;; # not yet in PATH -> prepend it - esac + [ -d "$dir" ] && prepend_unique PATH "${dir}" done < ignore - *) MANPATH="$dir:$MANPATH" ;; # not yet in MANPATH -> prepend it - esac + [ -d "$dir" ] && prepend_unique MANPATH "${dir}" done <