Gilles identificó su problema principal, pero quería intentar explicarlo de manera diferente.
Bash interpreta los escapes de solicitud especiales solo antes de expandir cualquier variable en la solicitud. Esto significa que el uso \e
de una variable que se expande desde el indicador no funciona, aunque sí funciona directamente PS1
.
Por ejemplo, esto funciona como se esperaba y da texto rojo:
PS1='\e[1;31m this is in red '
Pero esto no es así, solo pone un literal \e
en el indicador:
RED='\e[1;31m'
PS1="$RED not in red "
Si desea almacenar los escapes de color en las variables, puede usar la cita ANSI-C ( $'...'
) para poner un carácter de escape literal en la variable.
Para ello, puede cambiar su definición de GREEN
, RED
y NONE
, por lo que su valor es la secuencia de escape real.
GREEN=$'\033[1;32m'
RED=$'\033[1;31m'
NONE=$'\033[m'
Si haces eso, tu primero PS1
con las comillas simples debería funcionar:
PS1='${RED}\h $(get_path) ${exitStatus}${NONE} '
Sin embargo, entonces tendrás un segundo problema.
Intente ejecutar eso, luego presione Up Arrow, Homey su cursor no volverá al inicio de la línea.
Para solucionarlo, cambie PS1
para incluir \[
y \]
alrededor de las secuencias de escape de color, p. Ej.
PS1='\[${RED}\]\h $(get_path) $?\[${NONE}\] '
No se puede usar get_exit_status
correctamente aquí, ya que su salida contiene caracteres impresos (el código de salida) y no impresos (los códigos de color), y no hay forma de marcarlo correctamente en el mensaje. Ponerlo \[...\]
lo marcaría como no impreso en su totalidad, lo cual no es correcto. Tendrá que cambiar la función para que solo imprima el código de color adecuado y luego rodearlo \[...\]
en el indicador.
\[
es\1
, y\[
es\2
. Los que corresponden a algo de readlineRL_PROMPT_{START,END}_IGNORE
que le pide que ignore los bytes al contar la longitud del indicador en la pantalla. Ver lists.gnu.org/archive/html/bug-bash/2015-08/msg00027.html .