diff --git a/powerlevel9k.zsh-theme b/powerlevel9k.zsh-theme index 69bad29f..9fb231c1 100755 --- a/powerlevel9k.zsh-theme +++ b/powerlevel9k.zsh-theme @@ -563,14 +563,33 @@ prompt_custom() { # Display the duration the command needed to run. prompt_command_execution_time() { set_default POWERLEVEL9K_COMMAND_EXECUTION_TIME_THRESHOLD 3 + set_default POWERLEVEL9K_COMMAND_EXECUTION_TIME_PRECISION 2 + + # Print time in human readable format + # For that use `strftime` and convert + # the duration (float) to an seconds + # (integer). + # See http://unix.stackexchange.com/a/89748 + local humanReadableDuration + if (( _P9K_COMMAND_DURATION > 3600 )); then + humanReadableDuration=$(strftime '%H:%M:%S' $(( int(rint(_P9K_COMMAND_DURATION)) ))) + elif (( _P9K_COMMAND_DURATION > 60 )); then + humanReadableDuration=$(strftime '%M:%S' $(( int(rint(_P9K_COMMAND_DURATION)) ))) + else + # If the command executed in seconds, print as float. + # Convert to float + if [[ "${POWERLEVEL9K_COMMAND_EXECUTION_TIME_PRECISION}" == "0" ]]; then + # If user does not want microseconds, then we need to convert + # the duration to an integer. + typeset -i humanReadableDuration + else + typeset -F ${POWERLEVEL9K_COMMAND_EXECUTION_TIME_PRECISION} humanReadableDuration + fi + humanReadableDuration=$_P9K_COMMAND_DURATION + fi - local duration=$_P9K_COMMAND_DURATION - - [[ $_P9K_COMMAND_DURATION -gt 60 ]] && duration=$(strftime '%M:%S' $_P9K_COMMAND_DURATION) - [[ $_P9K_COMMAND_DURATION -gt 3600 ]] && duration=$(strftime '%H:%M:%S' $_P9K_COMMAND_DURATION) - - if [ $_P9K_COMMAND_DURATION -ge $POWERLEVEL9K_COMMAND_EXECUTION_TIME_THRESHOLD ]; then - "$1_prompt_segment" "$0" "$2" "red" "226" "${duration}" 'EXECUTION_TIME_ICON' + if (( _P9K_COMMAND_DURATION >= POWERLEVEL9K_COMMAND_EXECUTION_TIME_THRESHOLD )); then + "$1_prompt_segment" "$0" "$2" "red" "226" "${humanReadableDuration}" 'EXECUTION_TIME_ICON' fi } @@ -1179,13 +1198,13 @@ build_right_prompt() { } powerlevel9k_preexec() { - _P9K_TIMER_START=$EPOCHSECONDS + _P9K_TIMER_START=$EPOCHREALTIME } powerlevel9k_prepare_prompts() { RETVAL=$? - _P9K_COMMAND_DURATION=$((EPOCHSECONDS - _P9K_TIMER_START)) + _P9K_COMMAND_DURATION=$((EPOCHREALTIME - _P9K_TIMER_START)) # Reset start time _P9K_TIMER_START=99999999999 @@ -1267,6 +1286,9 @@ prompt_powerlevel9k_setup() { # initialize timing functions zmodload zsh/datetime + # Initialize math functions + zmodload zsh/mathfunc + # initialize hooks autoload -Uz add-zsh-hook diff --git a/test/segments/command_execution_time.spec b/test/segments/command_execution_time.spec index 5b6c782b..09738859 100755 --- a/test/segments/command_execution_time.spec +++ b/test/segments/command_execution_time.spec @@ -23,20 +23,58 @@ function testCommandExecutionTimeIsNotShownIfTimeIsBelowThreshold() { unset _P9K_COMMAND_DURATION } -function testCommandExecutionTimesThresholdCouldBeChanged() { - POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(custom_world command_execution_time) +function testCommandExecutionTimeThresholdCouldBeChanged() { + POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(command_execution_time) POWERLEVEL9K_COMMAND_EXECUTION_TIME_THRESHOLD=1 - _P9K_COMMAND_DURATION=2 + _P9K_COMMAND_DURATION=2.03 + + assertEquals "%K{red} %F{226%}Dur%f %F{226}2.03 %k%F{red}%f " "$(build_left_prompt)" + + unset POWERLEVEL9K_LEFT_PROMPT_ELEMENTS + unset _P9K_COMMAND_DURATION + unset POWERLEVEL9K_COMMAND_EXECUTION_TIME_THRESHOLD +} + +function testCommandExecutionTimeThresholdCouldBeSetToZero() { + POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(command_execution_time) + POWERLEVEL9K_COMMAND_EXECUTION_TIME_THRESHOLD=0 + _P9K_COMMAND_DURATION=0.03 + + assertEquals "%K{red} %F{226%}Dur%f %F{226}0.03 %k%F{red}%f " "$(build_left_prompt)" + + unset POWERLEVEL9K_LEFT_PROMPT_ELEMENTS + unset _P9K_COMMAND_DURATION + unset POWERLEVEL9K_COMMAND_EXECUTION_TIME_THRESHOLD +} - assertEquals "%K{red} %F{226%}Dur%f %F{226}2 %k%F{red}%f " "$(build_left_prompt)" +function testCommandExecutionTimePrecisionCouldBeChanged() { + POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(command_execution_time) + POWERLEVEL9K_COMMAND_EXECUTION_TIME_THRESHOLD=0 + POWERLEVEL9K_COMMAND_EXECUTION_TIME_PRECISION=4 + _P9K_COMMAND_DURATION=0.0001 + + assertEquals "%K{red} %F{226%}Dur%f %F{226}0.0001 %k%F{red}%f " "$(build_left_prompt)" unset POWERLEVEL9K_LEFT_PROMPT_ELEMENTS unset _P9K_COMMAND_DURATION + unset POWERLEVEL9K_COMMAND_EXECUTION_TIME_PRECISION unset POWERLEVEL9K_COMMAND_EXECUTION_TIME_THRESHOLD } +function testCommandExecutionTimePrecisionCouldBeSetToZero() { + POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(command_execution_time) + POWERLEVEL9K_COMMAND_EXECUTION_TIME_PRECISION=0 + _P9K_COMMAND_DURATION=23.5001 + + assertEquals "%K{red} %F{226%}Dur%f %F{226}23 %k%F{red}%f " "$(build_left_prompt)" + + unset POWERLEVEL9K_LEFT_PROMPT_ELEMENTS + unset _P9K_COMMAND_DURATION + unset POWERLEVEL9K_COMMAND_EXECUTION_TIME_PRECISION +} + function testCommandExecutionTimeIsFormattedHumandReadbleForMinuteLongCommand() { - POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(custom_world command_execution_time) + POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(command_execution_time) _P9K_COMMAND_DURATION=180 assertEquals "%K{red} %F{226%}Dur%f %F{226}03:00 %k%F{red}%f " "$(build_left_prompt)" @@ -46,7 +84,7 @@ function testCommandExecutionTimeIsFormattedHumandReadbleForMinuteLongCommand() } function testCommandExecutionTimeIsFormattedHumandReadbleForHourLongCommand() { - POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(custom_world command_execution_time) + POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(command_execution_time) _P9K_COMMAND_DURATION=7200 assertEquals "%K{red} %F{226%}Dur%f %F{226}02:00:00 %k%F{red}%f " "$(build_left_prompt)"