Linux: el indicador de coloreado de bash interrumpirá el retorno de carro

21

Cuando intento colorear el bash de esta manera:

export PS1="\e[0;31m[\u@\h \W]\$ \e[m "

rompe el retorno de carro (en lugar de ir a una nueva línea cuando la línea está llena, comienza en la misma línea y borra el texto ingresado).

Si elimino la secuencia de colores funciona bien.
Uso Ubuntu 11.10 y el terminal (guake también tiene el mismo error).

Abonec
fuente
Extraño. Funciona sin ningún problema en RedHat 5 y Mac OS X
Matteo
posible duplicado de Problema de PS1, cmd está en bucle
grawity

Respuestas:

37

Debes envolver todas las secuencias de escape entre \[ y \] para que 'readline' calcule correctamente la longitud visible del mensaje. Sin ellos, 'readline' piensa que el indicador es más largo de lo que es, y no sabe cuándo el texto alcanza el margen.

PS1=" \ [  \ e [; 31m  \]  [\ u @ \ h \ W] \ $  \ [  \ e [m  \]  " 
grawity
fuente
3
¡¡Gracias una tonelada!! Estaba tratando de encontrar algo de documentación sobre él en los documentos oficiales, pero no pude. El indicador de color 'stock' emplea este 'truco' y al principio me costó entender qué era exactamente, así que gracias por aclarar eso. up --- btw encontré la fuente de documentación en 'man readline 3' alrededor de la línea 684 y dice que esto en realidad se llama 'skip-csi-sequence' para aquellos que quieren saber dónde está la documentación. No creo que lo hubiera encontrado sin que me señalaras a readline (3) a pesar de que lo sabía antes, pero no pude hacer la conexión.
osirisgothra
¿Qué significa "envolver"? ¿Quieres decir envolver todo el asunto EN una \[, \]? Supongo que sí, pero no parece estar funcionando para mí.
Max Howell
1
@osirisgothra: La documentación en realidad está hablando de algo diferente: skip-csi-sequence está destinado a suprimir entrada Secuencias generadas por teclas especiales.
grawity
1
@MaxHowell tienes que envolver cada uno \e[xxm secuencia, no toda la cadena.
Enrico
Gracias. En mi caso acabo de reemplazar \e[39m con \[\e[;39m\] y funciona bien
Herrgott
1

La sugerencia [y] también funcionó en bash en OS X 10.8.2.

Yo suelo:

PS1 = "[\ e [0; 37m \ W \ $ (git branch 2 & gt; / dev / null | grep -e '*' | sed 's / ^ .. (. *) / {\ 1} /') \ $ \ e [m] "

que me muestra mi actual rama de git en uso.

stonefruit
fuente
¿Sabes de "__git_ps1"?
rafak
nopes ¿Qué cosa mágica hará?
stonefruit