2010-02-02 5 views
8

Ich weiß, dass ich einen date Befehl in meiner Zsh-Eingabeaufforderung ausführen kann. Allerdings zeigt es die alte Zeit; Um die aktuelle Uhrzeit zu sehen, muss ich <return> drücken und eine neue Eingabeaufforderung mit der aktuellen Uhrzeit erhalten.Ständig aktualisierte Uhr in Zsh-Eingabeaufforderung?

Gibt es eine Möglichkeit, die zsh-Eingabeaufforderung so zu konfigurieren, dass sie sich ständig selbst aktualisiert?

Antwort

8

Dies wäre .... unangenehm in einer Standard-Zsh-Eingabeaufforderung (oder Bash oder andere Shells).

Ich schlage vor, Sie wären besser dran mit Gnu Screen.

Der Bildschirm kann eine Statuszeile haben, die die Uhrzeit anzeigen kann. Here's an example screenrc Scrollen Sie nach unten zu "Red Hat Magazine Ein Leitfaden für GNU-Bildschirm", um das Beispiel zu sehen (ich werde das hier reproduzieren), die, wenn der Bildschirm läuft, die aktuelle Zeit in der unteren rechten Ecke des Terminals anzeigen:

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

5

Klingt wie eine angenehme Anfrage zu mir. Wenn überhaupt, ist es sinnvoller, die Zeit zu zeigen, als die Eingabeaufforderung angezeigt wurde.

Zum Glück Peter Stephenson posted a technique. Versuchen Sie so etwas wie dies in .zshrc:

PROMPT="[%T] %[email protected]%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 
+0

bemerken einfach die Post für Updates gefragt jede Sekunde. Ich habe es nicht ausprobiert, aber ich vermute "sched +1 schedprompt" am Ende von schedprompt() würde es tun. –

+0

Stellt fest, dass der Aufruf der Reset-Eingabeaufforderung das Scrollen im Termfenster rückgängig macht. Es macht schwer, rückwärts zu scrollen und dort für längere Zeit zu bleiben. –

+0

Es ist großartig! Es zeigt nicht nur die aktuelle Uhrzeit, sondern auch die Zeitstempel der ausgeführten Befehle. In Bezug auf das Scrollen Problem - Sie müssen nur "Scrollen bei Ausgabe" -Funktion des Terminals Ihrer Wahl ausschalten. – defhlt

34

Hinweis: ich diese Antwort für a similar question geschrieben, aber zu sehen, wie diese Frage mehr Ansichten hat, finde ich reposting meine Antwort wäre hier nützlich.

Dies ist in der Tat möglich, ohne auf seltsame Hacks zurückgreifen zu müssen. Ich habe das

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

TMOUT=1 

TRAPALRM() { 
    zle reset-prompt 
} 

Die TRAPALRM Funktion alle TMOUT Sekunden (in diesem Fall 1) aufgerufen wird, in meinem .zshrc bekam und hier führt es eine schnelle Auffrischung, und zwar bis eine Befehlsausführung beginnt (und es stört nichts, was Sie in die Eingabeaufforderung eingeben, bevor Sie die Eingabetaste drücken).

Quelle: http://www.zsh.org/mla/users/2007/msg00944.html (! Es ist von 2007)

+0

Ich kann bestätigen, dass das tatsächlich funktioniert, trotz wie einfach das erscheint. Alles was du wirklich brauchst, ist der TMOUT = ; TRAPALRM() {zle reset-prompt} 'Teil in deiner' $ HOME/.zshrc' Datei und du kannst loslegen. –

+3

Dies sollte die akzeptierte Antwort sein. Ich würde auch ein längeres Timeout als 1 Sekunde empfehlen. Ich habe TMOUT = 30 verwendet. Ich bemerkte, dass meine Muschel hing, wenn es jede Sekunde war. – brock

+1

Beachten Sie auch, dass dies das Kopieren und Einfügen nerviger macht. – d33tah