typeset -g globaldots_path="${HOME}/.global" if [[ -a $(realpath -m $(dirname $0)/../../.globaldir ) ]] then typeset -g globaldots_path=$(realpath -m $(dirname $0)/../../) fi if [[ -n ${GLOBALDOTS_PATH} ]] then typeset -g globaldots_path=${GLOBALDOTS_PATH} fi if [[ -z $globaldots_path ]]; then echo 'functions require $globaldots_path to be set!' fi #### BASIC ZSHLIBS TOOLS function zshlibs_update() { zbootstrap_message zlibs_update "preparing self update …" if [[ -n "$zshlibs_install" ]] then zbootstrap_message zlibs_update "cd into '$zshlibs_install' …" pushd $zshlibs_install 2>&1 > /dev/null zbootstrap_message zlibs_update "git pull …" ( git pull 2>&1 |zbootstrap_message zlibs_update & # > "${HOME}/.log/z_zshlibs_update" & ) zbootstrap_message zlibs_update "update done" popd 2>&1 > /dev/null else echo "\$zshlibs_install not set!" return 1 zlibs_install fi } function ztools_ensure() { target=${2} typ=${1} if ! test -e ${target} then zbootstrap_message ztools_ensure "creating '${target}' ($typ) …" case $typ in -d) mkdir -p ${target} \ || zbootstrap_message ztools_ensure "unable to create directory '${target}'" \ && return 2 ;; -f) touch ${target} \ || zbootstrap_message ztools_ensure "unable to create file '${target}'" \ && return 2 esac zbootstrap_message ztools_ensure "target '${target}' created" elif test ${typ} ${target} then zbootstrap_message ztools_ensure "target '${target}' ($typ) present" return 0 else zbootstrap_message ztools_ensure "target '${target}' already exists and it is not a directory" return 1 fi } ##### CONFIGURATION LIBRARIES function zlibs_path_expand() { } function global_path_expand() { local bin_base=${globaldots_path}/bin for pathnew in ${*}; do if [[ ! ${path[(r)${pathnew}]} ]] ; then path+=(${bin_base}/${pathnew}); fi done; } function global_fpath_expand() { local bin_base=${globaldots_path}/bin for pathnew in ${*}; do if [[ ! ${fpath[(r)${pathnew}]} ]] ; then fpath+=${bin_base}/${pathnew} fi done; } function zconfig_checkload() { typeset -a -g zconfig_loaded if [[ ! ${zconfig_loaded[(r)${1}]} ]] then zbootstrap_message zbootstrap "sourcing config '$1'" . -- $1 2>&1 >(zbootstrap_message zbootstrap) # >> "${HOME}/.log/z_zbootstrap.log" zconfig_loaded+=("$1") zbootstrap_message zbootstrap "end sourcing config '$1'" else zbootstrap_message zbootstrap "config '$1' already loaded" fi } function zconfigs_load() { for configfile in ${*}; do zconfig_checkload $configfile done } function zconfigs_local_load() { if [[ ! -a ${zconfig_local_path} ]]; then mkdir -p -m 700 ${zconfig_local_path} cp ${globaldots_path}/config/zsh/zshconfig.example ${zconfig_local_path}/local.config.zsh fi if [[ ! -d ${zconfig_local_path} ]]; then zconfig_checkload ${zconfig_local_path} else zconfigs_load ${zconfig_local_path}/*.config.zsh; fi } function zbootstrap_message() { local facility=$1 shift if [[ -n "${@}" ]] then echo "$(date -Ins) ${@}" >> "${HOME}/.log/z_$facility.log" else echo "$(date -Ins) $(cat)" >> "${HOME}/.log/z_$facility.log" fi } function zshlibs_boot() { # ensure log directory zbootstrap_message zbootstrap "ensure directory '${HOME}/.log/'" ztools_ensure -d "${HOME}/.log/" # loading configs typeset -a -g zconfig_loaded typeset -a -g path_extra typeset -a -g config_extra typeset -g zconfig_shared_path="${zshlibs_install}/config" typeset -g zconfig_local_path="${HOME}/.config/zsh" } function zbootstrap_noninteractive() { zbootstrap_message zbootstrap 'load global config' zconfig_checkload ${zconfig_shared_path}/global.config.zsh zbootstrap_message zbootstrap 'load local configs' zconfigs_local_load for zconfig in $config_extra; do zbootstrap_message zbootstrap 'load config extra $zconfig' zconfig_checkload ${zconfig_shared_path}/${zconfig}.config.zsh done # expanding settings zbootstrap_message zbootstrap "expanding path with '$path_extra'" global_path_expand $path_extra zbootstrap_message zbootstrap "expanding fpath with '$fpath_extra'" global_fpath_expand vanilla zbootstrap_message zbootstrap "done loading noninteractive config" } function zbootstrap () { zshlibs_boot zbootstrap_noninteractive zconfig_checkload ${zconfig_shared_path}/global.style.zsh zshlibs_update zbootstrap_message zbootstrap "done loading interactive config" }