diff --git a/dotfiles/ps1/ps1.sh b/dotfiles/ps1/ps1.sh index d0f3d02..218276b 100644 --- a/dotfiles/ps1/ps1.sh +++ b/dotfiles/ps1/ps1.sh @@ -70,17 +70,9 @@ __PS1_SYM="" __PS1_PATH="" __PS1_STATUS=0 __PS1_USE_NF=0 +__PS1_TEMPLATE="" -_ps1_update() { - __PS1_STATUS=$? - __PS1_SYM="$(_ps1_symbol)" - __PS1_PATH="$(_ps1_path)" - if _ps1_has_nf; then __PS1_USE_NF=1; else __PS1_USE_NF=0; fi -} - -ps1_on() { - PROMPT_COMMAND="_ps1_update" - +_ps1_build_template() { local RST="\[\e[0m\]" # Two-zone palette @@ -107,14 +99,40 @@ ps1_on() { local PROMPT_SYM="\$( [ \$__PS1_STATUS -eq 0 ] && printf '${OK}' || printf '${BAD}' )➜${RST}" - # Keep order: date time user | host path, newline, then prompt - PS1="\ + __PS1_TEMPLATE="\ ${FRAME}╭─${RST}\ ${Z1_BG}${Z1_FG}${LEFT_EXPR} \d \A \u ${RST}${Z1_BG}${Z2_BG}${Z2_FG}${SEP_EXPR}${RST}\ ${Z2_BG}${Z2_FG} @\h ${PATH_FG}\${__PS1_PATH} ${RST}${Z2_BG}${Z2_FG}${RIGHT_EXPR}${RST}\ \n${FRAME}╰── ${RST}${PROMPT_SYM} \${__PS1_SYM} " } +_ps1_set_prompt() { + if [[ -z "${__PS1_TEMPLATE}" ]]; then + _ps1_build_template + fi + PS1="${__PS1_TEMPLATE}" +} + +_ps1_update() { + __PS1_STATUS=$? + __PS1_SYM="$(_ps1_symbol)" + __PS1_PATH="$(_ps1_path)" + if _ps1_has_nf; then __PS1_USE_NF=1; else __PS1_USE_NF=0; fi + _ps1_set_prompt +} + +ps1_on() { + if [[ "${PROMPT_COMMAND:-}" != *"_ps1_update"* ]]; then + if [[ -n "${PROMPT_COMMAND:-}" ]]; then + PROMPT_COMMAND="${PROMPT_COMMAND}; _ps1_update" + else + PROMPT_COMMAND="_ps1_update" + fi + fi + + _ps1_set_prompt +} + ps1_off() { :; } # Enable by default when loaded (global standard)