aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDominik Ritter <dritter03@googlemail.com>2017-02-14 23:32:41 +0300
committerDominik Ritter <dritter03@googlemail.com>2017-02-14 23:32:41 +0300
commita202537dd7ec5aad772b81690c1e97fa40bfd0fe (patch)
treef5134080ac4299b8f903f91191aff75e5a905714
parentedb51fcba38370eb9f230c1e155eec8194086997 (diff)
Refactor `command_execution_time` segment
- Change internal precision to nanoseconds - Let the user decide about desired precision - Add tests
-rwxr-xr-xpowerlevel9k.zsh-theme40
-rwxr-xr-xtest/segments/command_execution_time.spec50
2 files changed, 75 insertions, 15 deletions
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)"