Problema de personalización rápida con la cláusula if

Problema de personalización rápida con la cláusula if

Recientemente modifiqué un poco mi PS1. El código de la siguiente manera:

PS1='$(if [[ $? != 0 ]]; then echo " \e[91m\e[0m"; fi) \u $(assemble_prompt)$ '

El carácter que falta es defuentes-nerdy no importa en mi pregunta (ni tampoco en assemble_promptla función).

El problema que encontré es una PS1 rota cuando reduje el tamaño de la ventana del terminal al tamaño de un mensaje (aprox.). Luego parece ignorar la configuración de PS1 y configura PS1 $solo con caracteres (ver captura de pantalla). Tenga en cuenta que cuando empiezo a escribir, simplemente anula mi mensaje personalizado en esta ocasión.

PS1 se volvió loca

Reduje el problema a una cláusula if que agrega un carácter de "fallo" si el comando anterior no tuvo éxito. Si elimino esa parte, todo funciona como se esperaba.

¿Hay alguna manera de mantener ifparte de la cláusula pero solucionar el problema con el reinicio de PS1 cuando el tamaño de la ventana es demasiado pequeño?

PD: Lo uso rxvt-unicodecomo terminal pero el problema persiste también en todos los demás terminales (probado xterm, st).

Respuesta1

Probablemente quieras incluir los códigos de control del terminal \[...\]para decirle a Bash que en realidad no están imprimiendo caracteres. De lo contrario, confundirán el shell cuando intenten contar el ancho del mensaje.

Entonces usa "\[\e[91m\]xxx\[\e[0m\]".

Desde elmanual:

\[  Begin a sequence of non-printing characters. 
    This could be used to embed a terminal control sequence into the prompt.
\]  End a sequence of non-printing characters.

información relacionada