
Digamos que mi mensaje se ve así (el _ representa mi cursor)
~ % _
¿Hay alguna manera de que pueda hacer que se vea así?
~ % _
[some status]
La pregunta era originalmente sobre zsh, pero ahora tiene otras respuestas.
Respuesta1
Las siguientes configuraciones parecen funcionar. El texto de la segunda línea desaparece si la línea de comando desborda la primera línea. La preexec
función borra la segunda línea antes de ejecutar el comando; Si desea conservarlo, cámbielo a preexec () { echo; }
.
terminfo_down_sc=$terminfo[cud1]$terminfo[cuu1]$terminfo[sc]$terminfo[cud1]
PS1_2='[some status]'
PS1="%{$terminfo_down_sc$PS1_2$terminfo[rc]%}%~ %# "
preexec () { print -rn -- $terminfo[el]; }
%
los escapes están documentados en el manual de zsh ( man zshmisc
).
Terminfo es una API de acceso a terminal. Zsh tiene un terminfo
módulo que da acceso a la base de datos de descripción del terminal: $terminfo[$cap]
es la secuencia de caracteres a enviar para ejercitar la capacidad del terminal $cap
, es decir, ejecutar su $cap
comando. Consulte man 5 terminfo
(en Linux, el número de sección puede variar en otras unidades) para obtener más información.
La secuencia de acciones es: mover el cursor una línea hacia abajo ( cud1
), luego retrocede ( cuu1
); guardar la posición del cursor ( sc
); mueva el cursor una línea hacia abajo; imprimir [some status]
; restaurar la posición del cursor. El bit de subida y bajada al principio sólo es necesario en caso de que el mensaje esté en la línea inferior de la pantalla. La línea preexec borra la segunda línea ( el
) para que no se mezcle con la salida del comando.
Si el texto de la segunda línea es más ancho que el terminal, la pantalla puede resultar confusa. Utilice Ctrl+ Len caso de necesidad para reparar.
Respuesta2
Aquí hay un bash
equivalente de la solución zsh de Gilles. Bash no tiene un módulo terminfo nativo, pero el tput
comando (incluido con terminfo
) hace prácticamente lo mismo.
PS1_line1='\w \$ '
PS1_line2='[some status]'
if (tput cuu1 && tput sc && tput rc && tput el) >/dev/null 2>&1
then
PS1="
\[$(tput cuu1; tput sc)\]
\[${PS1_line2}$(tput rc)\]${PS1_line1}"
PS2="\[$(tput el)\]> "
trap 'tput el' DEBUG
else
PS1="$PS1_line2 :: $PS1_line1"
fi
Si el terminal no admite una de las capacidades, recurrirá a un mensaje de una sola línea.
La trap
línea es una forma ingeniosa de emular la función de zsh preexec
. Verhttps://superuser.com/questions/175799/para más información.
EDITAR: Guión mejorado basado en los comentarios de Gilles.