zsh提示符中如何实现不断更新的时钟?

21

我知道可以在zsh提示符中执行date命令。但是,它显示的是时间;要查看当前时间,必须按下<return>并获取带有当前时间的新提示符。

有没有一种方法可以配置zsh提示符,使其每秒钟自动更新?

3个回答

70

注意:我为一个类似的问题写了这个答案,但是看到这个问题有更多的浏览量,我认为在这里重新发布我的答案会很有用。

事实上,这是可以做到的,而不必诉诸奇怪的技巧。我在我的.zshrc文件中实现了这个功能。

RPROMPT='[%D{%L:%M:%S %p}]'

TMOUT=1

TRAPALRM() {
    zle reset-prompt
}

TRAPALRM函数每隔TMOUT秒(在本例中为1)被调用一次,在此执行提示刷新,直到命令开始执行(并且不会干扰您在按回车键之前在提示符上输入的任何内容)。

来源:http://www.zsh.org/mla/users/2007/msg00944.html(来自2007年!)


1
我可以确认这确实有效,尽管看起来很简单。你只需要在你的 $HOME/.zshrc 文件中加入 TMOUT=<SECONDS>; TRAPALRM () { zle reset-prompt } 这一部分,然后就可以使用了。 - Alexej Magura
4
这应该是被接受的答案。我还建议将超时时间设置长一些,不要只有1秒钟。我使用了 TMOUT=30。当超时时间只设为每秒一次时,我发现我的shell会挂起。 - brock
2
另外,请注意这可能会使复制粘贴更加烦人。 - d33tah
1
在我的一台Centos机器上,如果在tmout之前设置Trapalrm为on,执行空的TRAPALRM会导致注销。 - zzapper
1
这应该是被接受的答案。虽然在某些系统上,这可能会导致复制和/或滚动方面的不便,但我使用这种技术而没有遇到这些问题。 - Tom
显示剩余4条评论

8
听起来对我来说是一个愉快的请求。如果有什么问题,显示提示时显示时间更有意义。
幸运的是,Peter Stephenson发表了一种技术。在.zshrc中尝试这样的东西:
PROMPT="[%T] %n@%M %~ %# "

schedprompt() {
  emulate -L zsh
  zmodload -i zsh/sched

  # Remove existing event, so that multiple calls to
  # "schedprompt" work OK.  (You could put one in precmd to push
  # the timer 30 seconds into the future, for example.)
  integer i=${"${(@)zsh_scheduled_events#*:*:}"[(I)schedprompt]}
  (( i )) && sched -$i

  # Test that zle is running before calling the widget (recommended
  # to avoid error messages).
  # Otherwise it updates on entry to zle, so there's no loss.
  zle && zle reset-prompt

  # This ensures we're not too far off the start of the minute
  sched +30 schedprompt
}

schedprompt

刚刚注意到帖子每秒钟要求更新。虽然我没有试过,但我猜在schedprompt()的末尾添加“sched +1 schedprompt”应该可以实现。 - Dave Cohen
原来调用reset-prompt会撤销终端窗口中的任何滚动。这使得向后滚动并在那里停留任意长时间变得困难。 - Dave Cohen
太棒了!它不仅显示当前时间,还会为执行的命令添加时间戳。至于滚动问题 - 你只需要关闭所选择终端的"输出时滚动"功能即可。 - defhlt
4
如果你只需要命令时间戳(就像我一样),你可以使用类似于以下的内容:preexec () { echo -e "\033[1Adate +%H:%M:%S " }。请注意,我的翻译尽可能保留了原文的意思和结构,并尽力使它更容易理解。 - Dan Berindei

6

在标准的zsh提示符(或bash、其他shell)中,这将会很不舒服。

我建议你最好使用Gnu Screen。

Screen可以有一个状态行,可以显示时间。 这里是一个screenrc示例,滚动到“Red Hat Magazine A guide to GNU Screen”以查看示例(我将在此处重现),当运行screen时,它将在终端的右下角显示当前时间:

~/.screenrc

hardstatus alwayslastline
hardstatus string '%{= kG}[ %{G}%H %{g}][%= %{=kw}%?%-Lw%?%{r}(%{W}%n*%f%t%?(%u)%?%{r})%{w}%?%+Lw%?%?%= %{g}][%{B}%Y-%m-%d %{W}%c %{g}]'
# 默认屏幕 screen -t shell1 0 screen -t shell2 1

http://www.gnu.org/software/screen/


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