Stale aktualizowany zegar w zsh prompt?

Wiem, że mogę wykonać polecenie date w moim wierszu polecenia zsh. Jednak pokazuje ona Stary czas; aby zobaczyć aktualny czas, muszę nacisnąć <return> i uzyskać nowy znak zachęty z bieżącym czasem.

Czy istnieje sposób, aby skonfigurować monit zsh, aby stale aktualizował się co sekundę?

Author: paulmelnikow, 2010-02-03

3 answers

To by było .... nieprzyjemne w standardowym podpowiedzi zsh (lub bash, lub innych powłok).

SugerujÄ™, Ĺźe lepiej byĹ ' oby uĹźyÄ ‡ Gnu Screen.

Ekran może mieć linię stanu, która może pokazywać czas. Oto przykładowy screenrc przewiń w dół do "Red Hat Magazine a guide to GNU Screen", aby zobaczyć próbkę (powtórzę to tutaj), która po uruchomieniu screena pokaże aktualny czas w prawym dolnym rogu ekranu. terminal:

~/.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}]'

# Default screens
screen -t shell1        0
screen -t shell2        1

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

 8
Author: SuperMagic,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-02-02 21:33:07

Uwaga: napisałem tę odpowiedź na podobne pytanie , ale widząc, jak to pytanie ma więcej wyświetleń, myślę, że umieszczenie mojej odpowiedzi tutaj byłoby przydatne.

Jest to w rzeczywistości możliwe bez uciekania się do dziwnych hacków. Mam to w swoim .zshrc
RPROMPT='[%D{%L:%M:%S %p}]'

TMOUT=1

TRAPALRM() {
    zle reset-prompt
}

Funkcja TRAPALRM jest wywoływana co sekundy tmout (w tym przypadku 1), a tutaj wykonuje odświeżanie i robi to, dopóki polecenie nie rozpocznie wykonywania (i nie koliduje z niczym, co wpisujesz na znak zachęty przed naciśnięciem enter).

Źródło: http://www.zsh.org/mla/users/2007/msg00944.html (jest z 2007 roku!)

 36
Author: nitarshan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:09:33

Brzmi jak miła Prośba. Jeśli coś ma więcej sensu niż pokazanie czasu, kiedy monit został wyświetlony.

Na szczęście Peter Stephenson opublikował technikę . Spróbuj czegoś takiego .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
 6
Author: Dave Cohen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-12-04 12:47:34