Las líneas largas se superponen en la solicitud personalizada de Bash PS1

13

He configurado un elegante PS1indicador de bash de dos líneas , con el nombre del servidor, la hora, el nombre de usuario y otras variables útiles.

PS1="\n\[\033[1;34m\]\342\226\210\342\226\210 \u @ $SERVER_NAME""$BBlue"" \w""$Color_Off  \n\[\033[0;36m\]\342\226\210\342\226\210 \d \t $ \[\033[0;39m\]"

ingrese la descripción de la imagen aquí

Fuente completa de Github aquí .

El problema es que las líneas largas a menudo se envuelven alrededor de sí mismas, lo que significa que la nueva línea se superpone a la anterior.

El problema es inconsistente: algunas líneas están ajustadas correctamente, otras no.

¿Algúna idea de cómo arreglar esto?

Adam Matan
fuente

Respuestas:

16

Aquí está mi elegante PS1 de dos líneas para bash prompt.

PS1

\[\e[1;32m\]\H\[\e[0m\] :: \[\e[1;30m\]\d\[\e[0m\] \@ :: \[\e[1;33m\]\w\n\[\e[1;34m\]\u $ \[\033[0m\]

Así que aquí está lo que hice. Si este fuera mi color:

\e[1;32m

Lo cambié a:

\[\e[1;32m\]

Esencialmente necesitas encerrarlo en:

\[$mycolor\]

Mira esta respuesta .

varunyellina
fuente
+1 gracias. Por extraño que parezca, no parece funcionar en Mac.
Adam Matan
Eres un salvavidas! En cuanto a mac, Adam ... Lo más probable es que se deba al recuento de columnas. Intente configurar el indicador en solo una cadena de caracteres, como 'este es mi indicador:' y vea si el problema persiste. Si es así, la configuración de su columna en su terminal es demasiado ancha o demasiado estrecha.
Alex Summers
7

Encontré esta solución en línea, lo que sugiere un cierre de corchetes a las variables de color:

Cambia esto:

Black='\e[0;30m'        # Black
Red='\e[0;31m'          # Red
Green='\e[0;32m'        # Green

a:

Black='\e[0;30m\]'        # Black
Red='\e[0;31m\]'          # Red
Green='\e[0;32m\]'        # Green

He comprometido el cambio , espero que funcione como se esperaba.

Adam Matan
fuente
1
No estoy seguro de lo que se supone que esto debe lograr. Debe envolver cualquier cosa que no ocupe espacio (ansi-escape) \[ \], por lo que no puede simplemente terminar con todos los colores de ansi-escape \]porque ¿qué pasa si no hay un \[? Cuando coloca caracteres no imprimibles, debe envolverlos \[ \](p PS1='\[\e[32;1m\] green prompt \[\e[0m\] $'. Ej .).
dylnmc
¡En efecto! Sin la apertura \ [, esto manda el aviso para los usuarios de Linux. ¿Quizás es diferente para OSX? Que extraño. \ [y \ e [se interpretan como dos cosas diferentes para linux. El primero indica que bash dice que la secuencia siguiente no se puede imprimir y que no se cuenta como parte de los caracteres que se muestran en la solicitud. El \ e [es el corchete de escape para iniciar un esquema de color ANSI.
Alex Summers el
0

Mi solución preferida para el problema de la superposición de líneas largas en bash PS1 es tener un \nal final de las líneas de solicitud de PS1.

p.ej

ingrese la descripción de la imagen aquí

Si desea todas mis otras cosas: tiempo, usuario, host, directorio y git branch (!) Puede usar esto (mac o linux):

/unix//a/124012/10043

Michael Durrant
fuente
para git branch deberías usar if [[ $(git rev-parse --is-inside-git-dir 2> /dev/null) ]]; then branch="$( git symbolic-ref --short -q HEAD 2> /dev/null )"; fi. Este es un estándar al colocar git en un script y evaluar el nombre de la rama de lo que he leído anteriormente.
dylnmc