Zsh更新提示符包含时间

6

我想在之前的命令提示符中更新输入该命令的时间。

根据我编写的代码,键入以下命令:

[--:--] 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
2个回答

1
你可以使用%T来获取当前时间并在提示符序列中使用。
此外,你可以使用%F{<color>}%f来简化提示符字符串,而不是在提示符中放置原始转义码。
因此,请删除该preexec函数并使用以下内容作为你的提示符:
PROMPT='[%T] %F{red}$USER:%F{green}%c%f$(git_prompt_info) %(!.#.$) '

1
这将在下一个提示上显示当前时间,而不是当前提示。 - chepner
1
它显示了每个提示符绘制时的当前时间。因此,在您当前的提示符上,它会显示上一个命令完成的时间。 - Marlon Richert
1
这不是 OP 所做的。他们正在用他们按下 Enter 的时间替换命令输入提示符中的 [--:--] - chepner
1
是的,我知道,但没有充分的理由支持它。这种方法更简单,并且也能获取原始问题中所需的信息。 - Marlon Richert
@CostaM 这个回答是否满足您的需求? - Marlon Richert
1
抱歉,我没有注意到这个讨论。我已经设法做了一些类似于你所建议的事情(毕竟过了这么多个月,我记不清具体是什么了),但正如chepner所说,我试图替换以前的 [--:--]。我仍在使用有缺陷的实现。 - CostaM

0
如果您要求ZSH定期使用当前时间刷新终端提示符,会发生什么?
PROMPT='[%D{%L:%M}] %{$fg[red]%}$USER:%{$reset_color%}%{$fg[green]%}%c%{$reset_color%}$(git_prompt_info) %(!.#.$) '

TMOUT=1

TRAPALRM() {
    zle reset-prompt
}

示例输出可跟踪计算机当前时间,精确到秒:

[11:41] costam:~ $ 

%D{%L:%M} 的效果与您使用的 date +"%H:%M" 相同。建议在 这里 查看 TMOUT。由于您只需要小时和分钟,因此可以将 TMOUT 值增加到10秒或更长时间。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接