deterjan
deterjan

Reputation: 390

zsh: print time next to command on execute

I want to configure zsh to append the time each command started next to the line command was executed on. For example:

# before I press ENTER
$ ./script

# after I press enter
$ ./script [15:55:58]
Running script...

I came up with the following config (which also colors the timestamp yellow):

preexec () {
  TIME=`date +"[%H:%M:%S] "`
  echo -e "$1 %{$fg[yellow]%}\033[1A\033[1C${TIME}$reset_color"
}

But it breaks and prints { and % characters on basic commands such as cat and echo. It also breaks on password prompts (macOS terminal). For example with echo:

$ echo "hello" [15:55:58] 
hello"hello" %{%}

How can I fix this config? Thank you.

Upvotes: 4

Views: 1422

Answers (2)

Christopher Settles
Christopher Settles

Reputation: 403

In your ~/.zshrc file, put:

function preexec() {
  timer=${timer:-$SECONDS}
}

function precmd() {
  if [ $timer ]; then
    timer_show=$(($SECONDS - $timer))
    export RPROMPT="%F{cyan}${timer_show}s %F{$black%}"
    unset timer
  fi
}

And that should give you something like this: enter image description here

Upvotes: 4

Paweł Paradowski
Paweł Paradowski

Reputation: 71

You inspired me and based on your script I wrote mine. I have tested this on zsh 5.4.smth.

preexec () {
  local TIME=`date +"[%H:%M:%S] "`
  local zero='%([BSUbfksu]|([FK]|){*})'
  local PROMPTLEN=${#${(S%%)PROMPT//$~zero/}}
  echo "\033[1A\033[$(($(echo -n $1 | wc -m)+$PROMPTLEN))C $fg[blue]${TIME}$reset_color"
}

Upvotes: 3

Related Questions