Evite caracteres de terminal dos comandos de terminal anteriores

3

Bem, acho que você sabe muito bem do que estou falando; Caso contrário, verifique este vídeo . Basicamente, quando você pressiona sua matriz para obter o comando anterior, geralmente os caracteres são deixados no terminal. Existe alguma maneira de contornar o problema?

EDIT: Este problema não acontece apenas com gdb , mas também com um terminal normal. Estas devem ser as linhas interessantes em .bashrc

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
unset color_prompt force_color_prompt

EDIT2: Ok, vou tentar explicar isso com um exemplo. Suponha que você tenha este histórico de terminal (bastante simplificado por questões de simplicidade):

user:host$>cd foo/bar
user:host$>sudo apt-get dist-upgrade
user:host$>clear
user:host$>

Então, se você pressionar a tecla de seta para cima 3 vezes, estará esperando algo como

user:host$>cd foo/bar

mas você está obtendo em vez disso

user:host $>sudo apcd foo/bar

Este é o cenário menos divertido com o qual você pode acabar, devo admitir; às vezes há um mosaico tão complexo na tela que você quer derrubar qualquer coisa. Eu não sei qual é a causa, acho que provavelmente formatou algo ruim no arquivo .bashrc , mas ainda não sei o quê.

No entanto, alterar as linhas .bashrc anteriores para algo como isto

if [ "$color_prompt" = yes ]; then
    PS1='\[3[1;31m\]\u:\[3[1;37m\]\W\$>\[3[0;32m\]'
    PS2='\[3[1;37m\]>\[3[0;32m\]'
else
    PS1='\u:\W\$'
    PS2='>'
fi

o problema desaparece parcialmente: ele não está mais acontecendo no shell normal, mas se eu iniciar o gdb , por exemplo, isso acontece na maior parte do tempo. Pode ser relacionado aos caracteres especiais?

EDIT3 Aqui estão as linhas relevantes em ~/.gdbinit file; você pode encontrar o arquivo inteiro aqui . Talvez a sequência \] final esteja faltando, não é?

 if $USECOLOR == 1
    # BLACK
    if $arg0 == 0
        echo 3[30m
     // a lot of other if-else conditions
    
por tigerjack89 13.05.2016 / 19:28

1 resposta

2

No prompt principal de bash ( $PS1 ), todos os caracteres não imprimíveis (por exemplo, seqüências de escape que alteram a cor) devem estar entre o literal \[ e \] .

Da mesma forma, para todos os outros aplicativos baseados em readline, como gdb , os caracteres não imprimíveis no prompt precisam ser colocados entre um 0x01 e um 0x02 byte. Você pode se referir a eles em .gdbinit as %code%21 e %code% .

    
por egmont 18.05.2016 / 13:19