.bashrc edit atrapalha o histórico de seta para cima do comando do terminal

1

Eu queria dar ao meu terminal no Ubuntu uma aparência mais pessoal, e queria mudar o texto antes do '$' ao escrever um comando.

Pelo que eu descobri isso é feito editando o arquivo .bashrc no diretório inicial, então eu fui lá e mudei

if [ "$color_prompt" = yes ]; then
    PS1='${debian_chroot:+($debian_chroot)}\[3[01;32m\]\u@\h\[3[00m\]:\[3[01;34m\]\w\[3[00m\]\$ '
else
    PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '
fi

para

if [ "$color_prompt" = yes ]; then
    PS1='${debian_chroot:+($debian_chroot)}\[3[01;32m\]\u@\h\[3[00m\]:\[3[01;34m\]\w\[3[00m\]\$ '
else
    PS1='\e[1;32m[\W]\$ \e[m'
fi

Isso funciona e o terminal parece do jeito que eu quero.

Mas depois de algum tempo ao digitar alguns comandos quando uso a tecla de seta para cima para acessar o histórico de comandos, as coisas ficam estranhas.

De uma linha limpa e pressionando a tecla de seta para cima funciona. Ao pressioná-lo novamente, o texto que estava na linha é limitado a aproximadamente 15 caracteres e o novo comando no histórico (que deve ser exibido) é limitado por alguns caracteres no início e eles são mesclados juntos na linha de comando.

Por exemplo meus dois comandos mais recentes são

Java Test4 words-250.txt words-250-in.txt
Javac Test4.java

Ao pressionar a tecla de seta para cima uma vez, a primeira linha é exibida, como deveria. Ao pressioná-lo pela segunda vez, isso é exibido:

Java Test4 worc Test4.java

Apesar desta saída estranha, o terminal funciona bem. Se, por exemplo, eu pressionar enter depois de fazer o acima, o Javac Test4.java será executado. Se eu tentar excluir a linha inteira usando backspace, só poderei excluir até que a linha diga

Java Test4

e se pressionar Enter depois disso, eu recebo uma nova linha vazia, como se a linha estivesse vazia ao pressionar Enter.

Tudo isso desaparece se eu redefinir o arquivo .bashrc.

Por que isso acontece e como posso corrigi-lo?

    
por darksmurf 19.04.2015 / 21:43

1 resposta

3

Eu não tenho ideia do porquê (nunca entendi os códigos de escape), mas adaptar o outro prompt parece funcionar:

PS1='\[3[1;32m\][\W]\$ \[3[00m\]'

Aparentemente, você precisa incluir as seqüências de escape em \[...\] , para dizer bash não contá-los ao determinar a largura do prompt. Portanto, tanto o PS1 acima quanto o seguinte funcionariam igualmente bem:

PS1='\[\e[1;32m\][\W]\$ \[\e[m\]'
    
por muru 19.04.2015 / 21:51