Linux: colorir o prompt do bash interromperá o retorno de carro

24

Quando tento colorir o bashprompt assim:

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

interrompe o retorno de carro (em vez de ir para uma nova linha quando a linha estiver cheia, inicia na mesma linha e apaga o texto de entrada).

Se eu remover a sequência de cores, ela funcionará bem.
Eu uso o Ubuntu 11.10 e o terminal (o guake também tem o mesmo bug).

Abonec
fonte
Estranho. Funciona sem qualquer problema no RedHat 5 e Mac OS X
Matteo
possível duplicata do problema PS1, cmd é looping
grawity

Respostas:

43

Você deve agrupar todas as seqüências de escape entre \[e \]para que 'readline' calcule corretamente o comprimento visível do prompt. Sem eles, o 'readline' acha que o prompt é mais longo do que é e não sabe quando o texto atinge a margem.

PS1 = " \ [ \ e [; 31m \] [\ u @ \ h \ W] \ $ \ [ \ e [m \] "
gravidade
fonte
4
Muito obrigado !! Eu estava tentando encontrar alguma documentação nos documentos oficiais, mas não consegui - o prompt de cores 'estoque' emprega esse 'truque' e eu tive dificuldade em descobrir o que exatamente era, então obrigado por esclarecer que up --- btw, na verdade, encontrei a fonte da documentação em 'man readline 3' em torno da linha 684 e diz que isso é realmente chamado de 'skip-csi-sequence' para aqueles que querem saber onde está a documentação. Eu não acho que eu teria encontrado isso sem você me indicar a readline (3), embora eu soubesse disso antes - não fizesse a conexão.
Osirisgothra
O que significa "wrap"? Você quer dizer quebrar a coisa toda IN um \[, \]? Acho que sim, mas não parece estar funcionando para mim.
Max Howell
2
@osirisgothra: A documentação está realmente falando de algo diferente - skip-csi-sequencedestina-se a suprimir seqüências de entrada geradas por chaves especiais.
grawity
1
@ MaxHowell, você precisa agrupar cada \e[xxmsequência, não a sequência inteira.
Enrico
Obrigado. No meu caso eu apenas substituído \e[39mcom \[\e[;39m\]e funciona bem
Herrgott
1

a dica [and] também funcionou no bash no OS X 10.8.2.

Eu uso:

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

o que me mostra meu ramo git atual em uso.

stonefruit
fonte
Você conhece o "__git_ps1"?
Rafak
não. que coisa mágica vai fazer?
stonefruit