Bash custom prompt quebra quebra de longas linhas de comando

7

Eu tenho um prompt bash personalizado que colore meu nome de usuário, hostname e diretório de trabalho atual. As cores são exibidas corretamente, no entanto, quando eu digito uma linha de comando que precisa ser agrupada, o terminal não inicia uma nova linha e grava sobre o início do meu comando. Isso ocorre no RHEL 4 e no Debian.

Esta questão detalha um problema semelhante no OS X; Parece que este é um problema com seqüências de controle terminadas incorretamente, no entanto, não consigo ver o que poderia estar causando isso, como eu estou usando códigos de $ (tput) em todos os lugares, em vez de mão crafting meus códigos. Snippet abaixo - alguém pode aconselhar o que estou fazendo errado?

# Control codes

COL_RST=$(tput sgr0)  # Remove all colour formatting
COL_BRIGHT=$(tput bold) # Emphasise

# Foreground
COL_G=$(tput setaf 2) # Green
COL_Y=$(tput setaf 3) # Yello
COL_B=$(tput setaf 4) # Blue

COL_USR=${COL_Y}${COL_BRIGHT}
COL_PWD=${COL_B}${COL_BRIGHT}
COL_HST=${COL_G}${COL_BRIGHT}

# Set prompt
PROMPT="${COL_USR}\u${COL_RST}@${COL_HST}\h${COL_RST}:${COL_PWD}\W${COL_RST}"

# Put it all together....
PS1="[$PROMPT]\$ "

export PS1
    
por Murali Suriar 13.12.2009 / 13:29

1 resposta

8

Agrupe cada uma das suas variáveis de cor em colchetes com escape:

\[${COL_USR}\]

ou

COL_USR="\[${COL_Y}${COL_BRIGHT}\]"

Isso diz ao Bash que estes devem ser considerados de largura zero.

Isso é exatamente como descrito na pergunta à qual você se vinculou. Se você fizer o seguinte comando, verá que sua variável contém sequências de caracteres semelhantes às sequências "feitas à mão". O uso de tput apenas torna as coisas portáveis para vários $TERM types, mas não afeta o tamanho das sequências de código. É esse comprimento que está jogando fora as coisas.

echo ${COL_USR} | hexdump -c
    
por 13.12.2009 / 13:48