local DIRNAME="$HOME/University/" mode::enable() { local mode_path="$DIRNAME/$1/.env" export MODE__ACTIVE_MODE="$1" export MODE__OLD_PS1="$PS1" export PS1="($1) $PS1" . "$mode_path" } mode::get_functions() { perl -ne '/^(?>function\s+)?([\x21-\x7e]+)\s*\(\)/ && print "$1\n"' < "$1" } mode::get_variables() { perl -ne '/^(?>declare\s+(?>--?\w+\s*)+\s*)?\s*([\x21-\x3c\x3e-\x7e]+)=.*$/ && print "$1\n"' < "$1" } mode::get_aliases() { perl -ne '/^(?:noglob\s+)?alias ([\x21-\x3c\x3e-\x7e]+)=(.*)\n/ && print "$1=$2\n"' < "$1" } mode::disable() { export PS1="$MODE__OLD_PS1" local mode_path="$DIRNAME/$MODE__ACTIVE_MODE/.env" unset -v "MODE__OLD_PS1" unset -v "MODE__ACTIVE_MODE" for mode_variable in ${(@f)"$(mode::get_variables "$mode_path")"}; do unset "$mode_variable" done for mode_function in ${(@f)"$(mode::get_functions "$mode_path")"}; do unset -f "$mode_function" done for mode_alias in ${(@f)"$(mode::get_aliases "$mode_path")"}; do unalias "${mode_alias%=*}" done } cd::enter() { [ -n "$MODE__ACTIVE_MODE" ] && mode::disable local module_name="$(cut -d/ -f1 <<<"${PWD#"$DIRNAME"}" )" [ ! -f "$DIRNAME/$module_name/.env" ] && return mode::enable "$module_name" } cd::leave() { [ -n "$MODE__ACTIVE_MODE" ] && mode::disable } m() { [ -z "$MODE__ACTIVE_MODE" ] && return 1 local mode_path="$DIRNAME/$MODE__ACTIVE_MODE/.env" for type in Aliases Functions Variables; do local arr=(${(@f)"$(mode::get_"${type:l}" "$mode_path")"}) [ "${#arr}" -gt 0 ] && { echo "$type:" printf '%s\n' "${arr[@]}" echo } done | head -n -1 } # vim: ft=zsh