首页 > 解决方案 > zsh:在执行命令旁边打印时间

问题描述

我想将 zsh 配置为在执行行命令旁边附加每个命令开始的时间。例如:

# before I press ENTER
$ ./script

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

我想出了以下配置(也将时间戳着色为黄色):

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

但它会在 和等基本命令上中断并打印{和字符。它还会在密码提示(macOS 终端)上中断。例如:%catechoecho

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

我该如何修复这个配置?谢谢你。

标签: zsh

解决方案


您启发了我,并根据您的脚本编写了我的脚本。我已经在 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"
}

推荐阅读