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:
- http://www.tldp.org/HOWTO/Bash-Prompt-HOWTO/x361.html
- https://.com/a/10564427/238913
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.