From 0b48a81b2a38297b791964d0866f6e38b7eaff6f Mon Sep 17 00:00:00 2001 From: Aleksandar 'The Cobra' Widulski Date: Sun, 6 Mar 2022 09:11:27 -0500 Subject: [PATCH] Very prompt Signed-off-by: Aleksandar 'The Cobra' Widulski --- .prompt | 143 ++++++++++++++++++++++++++++++++------------------------ 1 file changed, 82 insertions(+), 61 deletions(-) diff --git a/.prompt b/.prompt index 87b3944..6190574 100644 --- a/.prompt +++ b/.prompt @@ -4,10 +4,11 @@ __debug_trap() { # Set necessary pre-command variables (PROMPT_COMMAND is a # command so its excluded here) - if [[ "$BASH_COMMAND" != "$PROMPT_COMMAND" && - "$LAST_BASH_COMMAND" == "$PROMPT_COMMAND" ]]; then - LAST_RT="$EPOCHREALTIME" - INC_TIME=1 + if [[ "$BASH_COMMAND" != "$PROMPT_COMMAND" ]]; then + if [[ "$LAST_BASH_COMMAND" == "$PROMPT_COMMAND" ]]; then + LAST_RT="$EPOCHREALTIME" + INC_TIME=1 + fi fi LAST_BASH_COMMAND="$BASH_COMMAND" } @@ -16,72 +17,86 @@ trap '__debug_trap' DEBUG __get_cmd_time() { # Set hours minutes seconds and remove preceding zeros - TZ=UTC - local YEAR=$(($((10#$(printf '%(%Y)T' $CMD_TIME)))-1970)) - local DAYS=$((10#$(printf '%(%j)T' $CMD_TIME))) - local HOUR=$((10#$(printf '%(%H)T' $CMD_TIME))) - local MINS=$((10#$(printf '%(%M)T' $CMD_TIME))) - local SECS=$((10#$(printf '%(%S)T' $CMD_TIME))) #wtf sex??? + local YEAR=$((10#0$(($(TZ=UTC printf '%(%Y)T' $CMD_TIME)))-1970)) + local DAYS=$((10#$(TZ=UTC printf '%(%j)T' $CMD_TIME))) + local HOUR=$((10#$(TZ=UTC printf '%(%H)T' $CMD_TIME))) + local MINS=$((10#$(TZ=UTC printf '%(%M)T' $CMD_TIME))) + local SECS=$((10#$(TZ=UTC printf '%(%S)T' $CMD_TIME))) # Choose whether or not to print hours minutes and seconds - [ $CMD_TIME -ge 31536000 ] && printf '%sd ' ${YEAR:-0} - [ $CMD_TIME -ge 86400 ] && printf '%sd ' ${DAYS:-0} - [ $CMD_TIME -ge 3600 ] && printf '%sh ' ${HOUR:-0} - [ $CMD_TIME -ge 60 ] && printf '%sm ' ${MINS:-0} - [ $CMD_TIME -ge 1 ] && printf '%ss ' ${SECS:-0} - printf '%sμs' ${CMD_US:-0} + [[ $CMD_TIME -ge 31536000 ]] && printf '%sy ' ${YEAR:-0} + [[ $CMD_TIME -ge 86400 ]] && printf '%sd ' ${DAYS:-0} + [[ $CMD_TIME -ge 3600 ]] && printf '%sh ' ${HOUR:-0} + [[ $CMD_TIME -ge 60 ]] && printf '%sm ' ${MINS:-0} + [[ $CMD_TIME -ge 1 ]] && printf '%ss ' ${SECS:-0} + printf '%sμs' ${CMD_US:-0} } __sig() { # Giant switch case for getting the name of the signal (`kill -l`) - case $1 in - 126) printf ACCES ;; - 127) printf NOENT ;; - 129) printf HUP ;; - 130) printf INT ;; - 131) printf QUIT ;; - 132) printf ILL ;; - 133) printf TRAP ;; - 134) printf ABRT ;; - 135) printf BUS ;; - 136) printf FPE ;; - 137) printf KILL ;; - 138) printf USR1 ;; - 139) printf SEGV ;; - 140) printf USR2 ;; - 141) printf PIPE ;; - 142) printf ALRM ;; - 143) printf TERM ;; - 144) printf STKFLT ;; - 145) printf CHLD ;; - 146) printf CONT ;; - 147) printf STOP ;; - 148) printf TSTP ;; - 149) printf TTIN ;; - 150) printf TTOU ;; - 151) printf URG ;; - 152) printf XCPU ;; - 153) printf XFSZ ;; - 154) printf VTALRM ;; - 155) printf PROF ;; - 156) printf WINCH ;; - 157) printf IO ;; - 158) printf PWR ;; - 159) printf SYS ;; - 16[3-9]|1[7-8][0-9]|19[0-2]) printf RT$(($1-128)) ;; # Savagery - *) printf $1 ;; # Print exit code if not in list - esac + local RED="\[\033[31m\]" + local WHT="\[\033[37m\]" + j=0 + for i in $@; do + if [[ $j != 0 ]]; then + printf '%s' "$WHT" + [[ $(eval echo \${$((j+1))}) == ";" + || $(eval echo \${$((j-1))}) == ";" ]] && + printf ";" || + printf "|" + printf '%s' "$RED" + fi + j=$((j+1)) + case $i in + 126) printf ACCES ;; + 127) printf NOENT ;; + 129) printf HUP ;; + 130) printf INT ;; + 131) printf QUIT ;; + 132) printf ILL ;; + 133) printf TRAP ;; + 134) printf ABRT ;; + 135) printf BUS ;; + 136) printf FPE ;; + 137) printf KILL ;; + 138) printf USR1 ;; + 139) printf SEGV ;; + 140) printf USR2 ;; + 141) printf PIPE ;; + 142) printf ALRM ;; + 143) printf TERM ;; + 144) printf STKFLT ;; + 145) printf CHLD ;; + 146) printf CONT ;; + 147) printf STOP ;; + 148) printf TSTP ;; + 149) printf TTIN ;; + 150) printf TTOU ;; + 151) printf URG ;; + 152) printf XCPU ;; + 153) printf XFSZ ;; + 154) printf VTALRM ;; + 155) printf PROF ;; + 156) printf WINCH ;; + 157) printf IO ;; + 158) printf PWR ;; + 159) printf SYS ;; + 16[3-9]|1[7-8][0-9]|19[0-2]) printf RT$(($1-128)) ;; # Savagery + *) printf $i ;; # Print exit code if not in list + esac + done } __prompt() { # Get exit code - local PEC=${?:-0} + local PLC=(${PIPESTATUS[@]}) - # LAST_RT is not set before a command is run + # *_RT may not be set LAST_RT="${LAST_RT:-$EPOCHREALTIME}" + PROMPT_RT="${PROMPT_RT:-$EPOCHREALTIME}" # Reset time when prompt was first displayed after command - if [ ${INC_TIME:-1} -ne 0 ]; then + if [[ ${INC_TIME:-1} != 0 ]]; then PROMPT_RT="$EPOCHREALTIME" INC_TIME=0 fi @@ -89,8 +104,9 @@ __prompt() { # Get relative times # Remove decimal point, simulating multiplying by 1 million - PROMPT_RT1M="${PROMPT_RT%.*}${PROMPT_RT#*.}" - LAST_RT1M="${LAST_RT%.*}${LAST_RT#*.}" + local PROMPT_RT1M="${PROMPT_RT%.*}${PROMPT_RT#*.}" + local LAST_RT1M="${LAST_RT%.*}${LAST_RT#*.}" + # Subtract and divide by 1 million to get a more accurate difference CMD_TIME="$(((PROMPT_RT1M-LAST_RT1M)/1000000))" CMD_TIME="${CMD_TIME:-0}" @@ -101,7 +117,7 @@ __prompt() { local PROMPT_US_CLN="$((10#$PROMPT_US))" local PROMPT_US_CLN="${PROMPT_US_CLN:-0}" - [ $PROMPT_US_CLN -lt $LAST_US ] && + [[ $PROMPT_US_CLN < $LAST_US ]] && CMD_US="$((1$PROMPT_US-$LAST_US))" || CMD_US="$(($PROMPT_US_CLN-$LAST_US))" CMD_US="$((10#$CMD_US))" @@ -123,10 +139,15 @@ __prompt() { # Text # [INT], [4], etc. - local SIG="$([ $PEC -ne 0 ] && printf '%s[%s%s%s] ' "$BLU" "$RED" "$(__sig $PEC)" "$BLU")" + for i in ${PLC[@]}; do + if [[ $i > 0 ]]; then + local SIG="$(printf '%s[%s%s%s] ' "$BLU" "$RED" "$(__sig ${PLC[@]})" "$BLU")" + break + fi + done # [user@homeserver:~] - local COL="$([ $UID -eq 0 ] && printf %s "$RED" || printf %s "$YLW")" + local COL="$([[ $UID == 0 ]] && printf %s "$RED" || printf %s "$YLW")" local UHD="$BLD$BLU[$COL\u$PRP@$CYN\h$PRP:$GRN\w$BLU]" # 2y 351d 12m 43s 382969μs