Zsh 随时间更新提示

Cos*_*taM 6 zsh

我正在尝试使用写入命令的时间更新以前的命令提示符。

用我写的代码,输入以下命令

[--:--] costam:~ $ echo "Wrote this at 10:20"
Run Code Online (Sandbox Code Playgroud)

并在五分钟后启动它,结果如下:

[10:25] costam:~ $ echo "Wrote this at 10:20"
Wrote this at 10:20
Run Code Online (Sandbox Code Playgroud)




zsh-theme 中实现此目的的代码如下

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}]"
}
Run Code Online (Sandbox Code Playgroud)




问题是当命令超过一行或者有一个激活的虚拟环境时。在这种情况下,提示不会在它应该覆盖的地方被覆盖,结果如下:

# Multiline
[--:--] costam:~ (master) $ cat ~/.oh-my-zsh/custom/themes/davever
[10:20]-theme

# Virtualenv
[10:20]env) [--:--] costam:~ (master) $ echo "Broken"
Broken
Run Code Online (Sandbox Code Playgroud)

我正在考虑的一个解决方案是找到当前提示preexec(),然后[--:--]用当前时间替换,但我不知道如何或什至可能获得当前提示。

欢迎任何其他解决方案,只要时间以相同的方式(或非常相似)打印,而不是,例如,使用RPROMT或在新提示中打印在右侧。

谢谢!

Mar*_*ert 1

您只需使用即可%T获取提示序列中的当前时间。

%F{<color>}此外,您可以使用and%f来简化提示字符串,而不是将原始转义码放入提示中。

因此,删除该preexec函数并使用它作为提示:

PROMPT='[%T] %F{red}$USER:%F{green}%c%f$(git_prompt_info) %(!.#.$) '
Run Code Online (Sandbox Code Playgroud)