Linux: la coloration de l'invite bash interrompra le retour chariot

24

Lorsque j'essaie de coloriser l' bashinvite comme ceci:

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

il rompt le retour chariot (au lieu d'aller sur une nouvelle ligne lorsque la ligne est pleine, il commence sur la même ligne et efface le texte saisi).

Si je supprime la séquence de couleurs, cela fonctionne bien.
J'utilise Ubuntu 11.10 et le terminal (guake a le même bug aussi).

Abonec
la source
Étrange. Cela fonctionne sans aucun problème sur RedHat 5 et Mac OS X
Matteo
doublon possible du problème PS1, cmd est en boucle
grawity

Réponses:

43

Vous devez envelopper toutes les séquences d'échappement entre \[et \]afin que «readline» calcule correctement la longueur visible de l'invite. Sans eux, 'readline' pense que l'invite est plus longue qu'elle ne l'est et ne sait pas quand le texte atteint la marge.

PS1 = " \ [ \ e [; 31m \] [\ u @ \ h \ W] \ $ \ [ \ e [m \] "
grawity
la source
4
Merci beaucoup!! J'essayais de trouver de la documentation à ce sujet dans les documents officiels, mais je ne pouvais pas - l'invite de couleur `` stock '' emploie cette `` astuce '' et j'ai eu du mal au début à comprendre à quoi exactement c'était, alors merci d'avoir effacé ce --- en fait, j'ai trouvé la source de documentation dans 'man readline 3' autour de la ligne 684 et il est dit que cela s'appelle en fait 'skip-csi-sequence' pour ceux qui veulent savoir où se trouve la documentation à ce sujet. Je ne pense pas que je l'aurais trouvé sans que vous m'indiquiez de lire readline (3) même si je le savais avant - je n'ai pas réussi à établir la connexion.
osirisgothra
Que signifie «envelopper»? Voulez - vous dire envelopper la chose DANS un \[, \]? Je suppose que oui, mais cela ne semble pas fonctionner pour moi.
Max Howell
2
@osirisgothra: La documentation parle en fait d'une chose différente - skip-csi-sequenceest destinée à supprimer les séquences d' entrée générées par des touches spéciales.
grawity
1
@MaxHowell vous devez encapsuler chaque \e[xxmséquence, pas la chaîne entière.
Enrico
Merci. Dans mon cas, je viens de remplacer \e[39mpar \[\e[;39m\]et cela fonctionne bien
Herrgott
1

le conseil [et] a également fonctionné sur bash sur OS X 10.8.2.

J'utilise:

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

qui me montre ma branche git actuelle en cours d'utilisation.

fruit de pierre
la source
Vous connaissez "__git_ps1"?
rafak
nopes. quelle chose magique cela fera-t-il?
stonefruit