Постоянно обновляемые часы в подсказке zsh?

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

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


person anon    schedule 02.02.2010    source источник


Ответы (3)


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

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

Экран может иметь строку состояния, которая может показывать время. Вот пример screenrc прокрутите вниз до "Red Hat Magazine A guide to GNU 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}]'

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

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

person SuperMagic    schedule 02.02.2010

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

Это на самом деле возможно, не прибегая к странным хакам. У меня есть это в моем .zshrc

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

TMOUT=1

TRAPALRM() {
    zle reset-prompt
}

Функция TRAPALRM вызывается каждые TMOUT секунд (в данном случае 1), и здесь она выполняет обновление подсказки, и делает это до тех пор, пока команда не начнет выполнение (и она не мешает ничему, что вы вводите в подсказке до нажатия Enter).

Источник: http://www.zsh.org/mla/users/2007/msg00944.html (это с 2007 года!)

person nitarshan    schedule 29.07.2013
comment
Я могу подтвердить, что это действительно работает, несмотря на то, насколько это просто. Все, что вам действительно нужно, это часть TMOUT=<SECONDS>; TRAPALRM () { zle reset-prompt } в вашем файле $HOME/.zshrc, и все готово. - person Alexej Magura; 20.12.2013
comment
Это должен быть принятый ответ. Я бы также рекомендовал более длительный тайм-аут, чем 1 секунда. Я использовал TMOUT=30. Я заметил, что мой панцирь висит, когда это было каждую секунду. - person brock; 13.12.2014
comment
Также обратите внимание, что это может сделать копирование более раздражающим. - person d33tah; 02.07.2015
comment
Установите Trapalrm ПЕРЕД tmout, как на одном из моих ящиков Centos, выполняя null TRAPALRM, вызывая выход из системы - person zzapper; 04.05.2016
comment
Мне это не нравится, так как я больше не могу прокручивать назад и внимательно читать. Когда подсказка обновляется, она хочет прокрутить вниз - person Falk; 04.01.2018
comment
Это должен быть принятый ответ. Кроме того, хотя в некоторых системах кажется, что это вызывает неудобства при копировании и/или прокрутке, я использую этот метод, не испытывая этих проблем. - person Tom; 25.04.2020
comment
Синтаксис форматирования времени в zsh, чтобы избавить читателей от поиска: zsh.sourceforge.net/Doc/Release/ - person catleeball; 30.05.2020
comment
У этого решения есть проблема: вы не можете прокручивать назад в своем терминале@nitarshan - person ; 12.07.2020
comment
@user13268019 user13268019 Может быть, это зависит от того, какой терминал? - person trusktr; 19.09.2020

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

К счастью, Питер Стефенсон опубликовал методику. Попробуйте что-то подобное в .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
person Dave Cohen    schedule 04.12.2012
comment
Только что заметил, что пост просит обновления каждую секунду. Я не пробовал, но предполагаю, что sched +1 schedprompt в конце schedprompt() сделает это. - person Dave Cohen; 04.12.2012
comment
Оказывается, вызов reset-prompt отменяет любую прокрутку в окне термина. Трудно прокручивать назад и оставаться там в течение любого промежутка времени. - person Dave Cohen; 05.12.2012
comment
Это потрясающе! Он не только показывает текущее время, но и отмечает время выполненных команд. Что касается проблемы с прокруткой - вам просто нужно отключить scroll on output функцию выбранного вами терминала. - person defhlt; 08.12.2012
comment
@ArtemIce Если вам просто нужна отметка времени команды (как я), вы можете использовать что-то вроде этого: preexec () { echo -e \033[1Adate +%H:%M:%S } - person Dan Berindei; 28.12.2012