2010-02-02 12 views
8

Sé que puedo ejecutar un comando date en mi prompt de zsh. Sin embargo, muestra el antiguo tiempo; para ver la hora actual, tengo que pulsar <return> y obtener un nuevo aviso con la hora actual.¿Reloj constantemente actualizado en el prompt zsh?

¿Hay alguna manera de configurar el indicador zsh para que se actualice constantemente cada segundo?

Respuesta

8

Esto sería ... desagradable en un prompt zsh estándar (o bash, u otras shells).

Le sugiero que sería mejor utilizar la pantalla Gnu.

La pantalla puede tener una línea de estado que puede mostrar la hora. Here's an example screenrc Desplácese hasta "Red Hat Magazine Una guía para la pantalla GNU" para ver la muestra (lo reproduciré aquí) que, cuando se muestre la pantalla, muestre la hora actual en la esquina inferior derecha de la 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/

5

suena como una petición agradable para mí. En todo caso, tiene más sentido que mostrar la hora en que se mostró el mensaje.

Afortunadamente Peter Stephenson posted a technique. Pruebe algo como esto en .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

acabo de notar el puesto solicitado actualización cada segundo. No lo he probado, pero supongo que "sched +1 schedprompt" al final de schedprompt() lo haría. –

+0

Desactiva la llamada a restablecimiento-solicitud deshace cualquier desplazamiento en la ventana de términos. Hace que sea difícil desplazarse hacia atrás y permanecer allí durante cualquier período de tiempo. –

+0

¡Es asombroso! No solo muestra la hora actual sino también los comandos de ejecución de la marca de tiempo. En cuanto al problema de desplazamiento, solo tiene que desactivar la función 'scroll on output' de su terminal de elección. – defhlt

34

Nota: Escribí esta respuesta para a similar question, pero al ver cómo esta cuestión tiene más puntos de vista creo que reposting mi respuesta aquí sería útil.

Esto es de hecho posible sin recurrir a extraños hacks. Tengo esto en mi .zshrc

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

TMOUT=1 

TRAPALRM() { 
    zle reset-prompt 
} 

La función se llama a cada TRAPALRM Tmout segundos (en este caso 1), y aquí se realiza una actualización del sistema, y ​​lo hace hasta que un comando inicia la ejecución (y no interfiere con nada que escriba en el aviso antes de presionar enter).

Fuente: http://www.zsh.org/mla/users/2007/msg00944.html (! Es a partir de 2007)

+0

Puedo confirmar que esto realmente funciona, a pesar de lo simple que parece. Todo lo que realmente necesitas es 'TMOUT = ; TRAPALRM() {zle reset-prompt} 'forma parte de su archivo' $ HOME/.zshrc' y ya está listo. –

+3

Esta debería ser la respuesta aceptada. También recomendaría un tiempo de espera más largo de 1 segundo. Usé 'TMOUT = 30'. Noté que mi caparazón colgaba cuando era cada segundo. – brock

+1

Además, tenga en cuenta que esto podría hacer que copiar y pegar sea más molesto. – d33tah