# Shell functions useful to all shells. # Helper function to print debug information if $DEBUG is not empty. # # Doesn't fit perfectly in this file, but this is the best place to make it # available everywhere. source_debug() { if [ x$DEBUG != x ]; then echo $@ fi } # Sources a configuration file if it exists; loads a fallback .local file if # it doesn't. If the .local files doesn't exist nothing is sourced. # # $1: Path to directory where configuration files are located. # $2: Directory name in $1 where the non .local files are stored, can be # empty. If empty both configuration files (normal and .local) are stored # in $1. # $3: Base name of file in $2, for example "rc" or "env". # $4: Extension for $3, if this file doesn't exist "$1/$3.local" is sourced. # Can be empty, then no extension is used. # $5: Additional options, set to nolocal to prevent loading of "$1/$3.local" # if "$1/$2/$3.$4" doesn't exist. # # Example with the following directory/file structure, $os is Darwin and # $hostname is marvin. # # ~/.zsh # ~/.zsh/env # ~/.zsh/env.local # ~/.zsh/rc # ~/.zsh/rc.local # ~/.zsh/host/rc.marvin # ~/.zsh/os/rc.Darwin # # To load additional rc files from within ~/.zsh/rc use the following: # # source_config ~/.zsh os rc $os # loads os/rc.Darwin # source_config ~/.zsh host rc $hostname # loads host/rc.marvin # # To load additional env files from within ~/.zsh/env use the following (note # nolocal to prevent loading env.local two times if os and host files don't # exist): # # source_config zsh os env $os nolocal # loads os/rc.Darwin # source_config zsh host env $hostname # loads env.local # # By letting $4 empty normal configuration files can be sourced. A .local can # still be used. # # source_config zsh "" file # loads zsh/file if it exists # # Doesn't fit perfectly in this file, but this is the best place to make it # available everywhere. # # If DEBUG is set to a non empty value additional debug output is printed. source_config() { # Path to the file to source and its local counterpart. if [ x$4 != x ]; then source_file=$1/$2/$3.$4 # If $4 is empty don't append a trailing dot. This allows source_config() # to load normal configuration files. else source_file=$1/$2/$3 fi source_file_local=$1/$3.local # Additional debug output. source_debug "source_config(): checking if $source_file exists" source_debug "source_config(): checking if $source_file_local exists" # If the file does exist then source it. if [ -f $source_file ]; then source_debug "source_config(): -> sourcing $source_file" . $source_file # Otherwise load the .local file if it exists and .local files are # allowed. elif [ -f $source_file_local -a x$5 != xnolocal ]; then source_debug "source_config(): -> sourcing $source_file_local" . $source_file_local else source_debug "source_config(): -> neither exists" fi unset source_file source_file_local } # vim: ft=sh