我想在之前的命令提示符中更新输入该命令的时间。
根据我编写的代码,键入以下命令:
[--:--] costam:~ $ echo "Wrote this at 10:20"
在五分钟后启动它,会产生以下输出结果:
[10:25] costam:~ $ echo "Wrote this at 10:20"
Wrote this at 10:20
为了实现这一目标,zsh主题中的代码如下。
PROMPT='[--:--] %{$fg[red]%}$USER:%{$reset_color%}%{$fg[green]%}%c%{$reset_color%}$(git_prompt_info) %(!.#.$) '
preexec () {
DATE=`date +"%H:%M"`
echo -e "\r\033[1A[${DATE}]"
}
问题出在命令超过一行或虚拟环境已激活时。在这种情况下,提示符未被正确覆盖,导致出现如下情况:
# Multiline
[--:--] costam:~ (master) $ cat ~/.oh-my-zsh/custom/themes/davever
[10:20]-theme
# Virtualenv
[10:20]env) [--:--] costam:~ (master) $ echo "Broken"
Broken
我想到的一个解决方案是,在
preexec()
中查找当前提示符,然后用当前时间替换[--:--]
,但我不知道如何获取当前提示符,或者是否可能获取。欢迎提出任何其他解决方案,只要时间以相同或非常相似的方式打印,而不是例如使用
RPROMT
在右侧打印或在新提示符中打印。谢谢!
PROMPT
的开头推荐使用\e[s
来保存当前终端位置,然后使用\e[u
而不是\r
将光标移动到保存的位置。但是,由于preexec
在打印换行符以终止命令后才执行,这意味着提示符的位置在preexec
写入日期时已经改变了。我不确定是否有好的解决方案。 - chepner