Quebra de linhas quando tentamos colorir o terminal PS1 (mesmo quando escapamos de caracteres que não são impressos)

3

Desde que comecei a trabalhar por muito tempo sem conectar meu laptop, estou tentando escrever um novo PS1 que mostre o status atual da bateria usando upup. Eu estou quase lá, tudo está funcionando bem, exceto aquele pequeno (chato) bug com cor e quebra (ou mais precisamente, a falta de, por exemplo, caracteres são impressos no começo da mesma linha quando o final da janela é atingido / nenhuma nova linha). No começo, eu pensei que tinha cometido um erro (como todos os posts anteriores que eu vi sobre esse tópico até agora) e esqueci de escapar de caracteres não imprimíveis (com \ [\] ), mas eu posso veja onde ... Se não, há algum problema conhecido com imbricação de alias e função no PS1 (ou alguém teve uma ideia melhor para fazer o que estou tentando fazer?)?

Aqui está minha PS1 (a parte "se colorido"):

PS1='${debian_chroot:+($debian_chroot)}\[3[01;32m\]\u@\h\[3[00m\]('battPer')-\A:\[3[01;34m\]\w\[3[00m\]\$ '

E a função batPer (e alias) no meu .bash_aliases (comentários abaixo):

batPer()
{
 percent='upower -i /org/freedesktop/UPower/devices/battery_BAT1 | grep -E percentage | cut -d : -f 2 | cut -d " " -f 11 | cut -d % -f 1'
 plugged='upower -i /org/freedesktop/UPower/devices/line_power_ACAD | grep -E "online: " | cut -d y -f 2' 

if [ "$plugged" = 'es' ] ; then
    echo -e "\[\e[0;92m\]$percent%\[\e[0m\]"
else
  if [ "$percent" -le 10 ]  ; then
     echo -e "\[\e[0;91m\]$percent%"
  else 
     echo -e "\[\e[0m\]$percent%" 
  fi
fi
 }
alias battPer='batPer'

(Eu estou tomando o valor de line_power_ACAD desde que o status muda assim que eu (un) conecto meu laptop - eu estou tirando "y" do "sim" como -f para o meu corte e, portanto, "es" "porque ... eeerrr ... eu sou preguiçoso;) - então eu testo: plugado - > valor em verde, não conectado: < 10% todo o termo char em vermelho, > 10% redefinir cor / branco. Eu estou fazendo o alias no final porque eu tinha problema ao tentar colocar a função em si no PS1).

Obrigado por me salvar de longas noites de pesadelos coloridos, desculpe se há um grande erro no meio da minha bagunça, eu tenho olhado para essas linhas por muito tempo ...

Atualização: Desculpe, esqueci de buscar o .bashrc depois do último mod, estou ficando ainda mais perdido, quando \[\e[0;92m\]$percent%\[\e[0m\] a saída é: e quando eu não coloco os caracteres de escape, tudo bem (porcentagem em verde) - ainda não há quebra automática ... Estou fugindo dos caracteres de escape em algum lugar?!?

    
por Simon Van Machin 07.03.2018 / 16:37

1 resposta

2

O problema seria que (grifo meu, do manual do bash ):

% bl0ck_qu0te%

Assim, o \[ na saída da sua função chega tarde demais para informar ao Bash que os códigos de controle são seguidos. Você precisa definir PS1 com a saída da função incluída para que isso funcione. Eu sugiro usar PROMPT_COMMAND assim:

PROMPT_COMMAND='PS1="${debian_chroot:+($debian_chroot)}\[3[01;32m\]\u@\h\[3[00m\]('batPer')-\A:\[3[01;34m\]\w\[3[00m\]\$ "'

Note como as aspas internas são aspas duplas, então cada vez que PS1 é setado, a saída da função é adicionada a ele, e então Bash decodifica PS1 para exibir o prompt.

Nota: com isso, você não precisa echo -e da saída. Antes, você precisava disso para cores, já que o Bash não estava interpretando depois da expansão da string PS1 . Agora, o Bash decodificará os códigos de controle também.

    
por muru 07.03.2018 / 17:01