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).


Étrange. Cela fonctionne sans aucun problème sur RedHat 5 et Mac OS X
Matteo

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 \] "

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.


Vous connaissez "__git_ps1"?
rafak

nopes. quelle chose magique cela fera-t-il?
stonefruit
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.