zona horaria hora funciona fecha establecer celular cambiar automáticamente automatica ajustar actualizar zsh prompt zsh-zle

horaria - zsh: mensaje de actualización con la hora actual cuando se inicia un comando



establecer fecha y hora automáticamente (6)

Tengo un prompt zsh me gusta: evalúa la hora actual en precmd y lo muestra en el lado derecho del prompt:

[Floatie:~] ^_^ cbowns% [9:28:31 on 2012-10-29]

Sin embargo, esto no es exactamente lo que quiero: como puede ver a continuación, esta vez es en realidad el momento en que salió el comando anterior, no el momento en que se inició el comando:

[Floatie:~] ^_^ cbowns% date [9:28:26 on 2012-10-29] Mon Oct 29 09:28:31 PDT 2012 [Floatie:~] ^_^ cbowns% date [9:28:31 on 2012-10-29] Mon Oct 29 09:28:37 PDT 2012 [Floatie:~] ^_^ cbowns% [9:28:37 on 2012-10-29]

¿Hay un gancho en zsh para ejecutar un comando justo antes de que el shell inicie un nuevo comando para que pueda actualizar la indicación de la hora del indicador? (¿Vi Constante el reloj actualizado en el indicador de zsh?, Pero no necesito que se actualice constantemente , solo se actualiza cuando presiono Intro.)

( ^_^ Se basa en el código de retorno del comando anterior. Se muestra ;_; en rojo cuando hay un estado de salida distinto de cero).


Aprovechando la genial answer estilo ZSH de @vitaŭt-bajaryn:

Creo que reemplazar la función de línea de aceptación es probablemente la solución zsh más idiomática:

function _reset-prompt-and-accept-line { zle reset-prompt zle .accept-line # Note the . meaning the built-in accept-line. } zle -N accept-line _reset-prompt-and-accept-line


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

RPROMPT=''[%D{%L:%M:%S %p}]'' TMOUT=1 TRAPALRM() { zle reset-prompt }

La función TRAPALRM recibe llamadas cada TMOUT segundos (en este caso 1), y aquí realiza una actualización de solicitud, y lo hace hasta que se inicia la ejecución de un comando (y no interfiere con nada de lo que escribe en la solicitud antes de pulsar Intro). Sé que no es necesario que se actualice constantemente, pero aún así se hace el trabajo sin necesidad de una línea por sí mismo.

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


Puede Return a asignar la tecla de Return para restablecer la solicitud antes de aceptar la línea:

reset-prompt-and-accept-line() { zle reset-prompt zle accept-line } zle -N reset-prompt-and-accept-line bindkey ''^m'' reset-prompt-and-accept-line


Puede usar secuencias de escape ANSI para escribir sobre la línea anterior, como esto:

preexec () { DATE=`date +"%H:%M:%S on %Y-%m-%d"` C=$(($COLUMNS-24)) echo -e "/033[1A/033[${C}C ${DATE} " }


Tuve una lucha para hacer esto:

Muestra la fecha en el lado derecho cuando se ha ejecutado el comando. No sobrescribe el comando mostrado. Advertencia: puede sobrescribir el RPROMPT actual.

strlen () { FOO=$1 local zero=''%([BSUbfksu]|([FB]|){*})'' LEN=${#${(S%%)FOO//$~zero/}} echo $LEN } # show right prompt with date ONLY when command is executed preexec () { DATE=$( date +"[%H:%M:%S]" ) local len_right=$( strlen "$DATE" ) len_right=$(( $len_right+1 )) local right_start=$(($COLUMNS - $len_right)) local len_cmd=$( strlen "$@" ) local len_prompt=$(strlen "$PROMPT" ) local len_left=$(($len_cmd+$len_prompt)) RDATE="/033[${right_start}C ${DATE}" if [ $len_left -lt $right_start ]; then # command does not overwrite right prompt # ok to move up one line echo -e "/033[1A${RDATE}" else echo -e "${RDATE}" fi }

Fuentes:


zsh ejecutará la función preexec justo antes de ejecutar una línea. Sería sencillo tener esa salida a la hora actual, una versión simple sería:

preexec() { date }

Modificar un aviso existente sería mucho más difícil.