2010-02-02 9 views
8

So che posso eseguire un comando date nel mio prompt zsh. Tuttavia, mostra il tempo vecchio; per vedere l'ora corrente, devo colpire <return> e ottenere un nuovo prompt con l'ora corrente.Orologio costantemente aggiornato nel prompt di zsh?

C'è un modo per configurare il prompt zsh di aggiornarsi costantemente ogni secondo?

risposta

8

Questo sarebbe .... spiacevole in un prompt zsh standard (o bash o altre shell).

Ti suggerisco di stare meglio usando Gnu Screen.

Lo schermo può avere una riga di stato che può mostrare l'ora. Here's an example screenrc scorrere verso il basso fino a "Red Hat Magazine Una guida allo schermo GNU" per vedere il campione (riprodurrò qui) che mostrerà l'ora corrente nell'angolo in basso a destra del terminale:

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

suona come una piacevole richiesta di me. Semmai ha più senso che mostrare l'ora in cui è stato visualizzato il prompt.

Fortunatamente Peter Stephenson posted a technique. Prova qualcosa di simile 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

appena notato il palo chiesto per l'aggiornamento ogni secondo. Non l'ho provato, ma suppongo che "sched +1 schedprompt" alla fine di schedprompt() lo farebbe. –

+0

La chiamata al reset-prompt annulla qualsiasi scorrimento nella finestra dei termini. Rende difficile scorrere all'indietro e rimanere lì per un certo periodo di tempo. –

+0

È fantastico! Non solo mostra l'ora corrente, ma anche i timestamp eseguono i comandi. Per quanto riguarda il problema di scorrimento, è sufficiente disattivare la funzione di scorrimento in uscita del terminale scelto. – defhlt

34

Nota: ho scritto questa risposta per a similar question, ma vedendo come questa domanda ha più punti di vista penso che reinserire la mia risposta qui sarebbe utile.

Questo è infatti possibile senza ricorrere a hack strani. Ho questo nel mio .zshrc

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

TMOUT=1 

TRAPALRM() { 
    zle reset-prompt 
} 

La funzione TRAPALRM viene chiamata ogni secondi TMOUT (in questo caso 1), e qui si esegue un aggiornamento rapido, e lo fa fino a quando un comando avvia l'esecuzione (e non interferisce con ciò che scrivi sul prompt prima di premere invio).

Fonte: http://www.zsh.org/mla/users/2007/msg00944.html (! E 'dal 2007)

+0

Posso confermare che questo funziona davvero, nonostante la semplicità che appare. Tutto ciò di cui hai veramente bisogno è il 'TMOUT = ; TRAPALRM() {zle reset-prompt} 'parte nel file' $ HOME/.zshrc' e sei pronto per partire. –

+3

Questa dovrebbe essere la risposta accettata. Suggerirei anche un timeout più lungo di 1 secondo. Ho usato 'TMOUT = 30'. Ho notato il mio guscio appeso quando era ogni secondo. – brock

+1

Inoltre, si noti che questo potrebbe rendere più fastidioso il copia-incolla. – d33tah