Постоянно обновляемые часы в zsh подскажите? - PullRequest
8 голосов
/ 03 февраля 2010

Я знаю, что могу выполнить команду date в моем приглашении zsh. Тем не менее, он показывает старое время; чтобы увидеть текущее время, я должен нажать <return> и получить новый запрос с текущим временем.

Есть ли способ настроить приглашение zsh на постоянное обновление каждую секунду?

Ответы [ 3 ]

36 голосов
/ 29 июля 2013

Примечание: я написал этот ответ для аналогичного вопроса , но, учитывая, что этот вопрос имеет больше просмотров, я думаю, что опубликовать свой ответ здесь было бы полезно.

На самом деле это возможно, не прибегая к странным взломам. У меня есть это в моем .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 года!)

8 голосов
/ 03 февраля 2010

Это было бы .... неприятно в стандартной подсказке zsh (или bash, или других оболочках).

Я предлагаю вам лучше использовать Gnu Screen.

Экран может иметь строку состояния, которая может показывать время. Вот пример screenrc . Прокрутите вниз до "Red Hat Magazine Руководство по экрану GNU", чтобы увидеть пример (я воспроизведу его здесь), который при запуске экрана покажет текущее время в правый угол терминала:

~ / .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/

6 голосов
/ 04 декабря 2012

Звучит как приятная просьба для меня. Во всяком случае, это имеет больше смысла, чем показ времени отображения подсказки.

К счастью Питер Стивенсон опубликовал технику . Попробуйте что-то вроде этого в .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
...