Como alterar a cor de fundo para exatamente uma linha?

2

Aqui estão minhas tentativas:

Oúltimotrabalhou,masquebraocopiar-colar(adicionandomuitosespaçosquandocopiado).Existeumamaneiramelhor?

Textoparacópia:

$PS1='\['$'\x1b[0m\]$'$echo-e"\x1b[41;37mWarning text\x1b[0m"; echo Normal text
Warning text
Normal text
$ echo -ne "\x1b[41;37mWarning text"$'\n'"\x1b[0m"; echo Normal text
Warning text
Normal text
$ echo -ne "\x1b[41;37mWarning text"$'\n'"\x1b[47;30m"; tr </dev/zero \0 \ |head -c 80; echo -ne "\x1b[A";  echo Normal text
Warning text
Normal text                                                                     
$ 
$ t="Warning text";echo -ne "\x1b[41;37m";echo -n "$t";{ tr </dev/zero \0 \ |head -c $(bc <<<"$(stty -a <&3|grep -Po '(?<=columns )[0-9]+')-$(wc -c<<<"$t")+1"); } 3<&0;echo -e "\x1b[0m";echo "Normal text"
Warning text                                                                    
Normal text
$ 
    
por user23013 24.06.2016 / 15:18

4 respostas

2

encontrou a solução mim mesmo (em esta questão relacionada ). Use isto:

echo -e '\x1b[41;37mWarning text\x1b[K\x1b[0m';echo Normal text

A documentação diz sobre \x1b[K :

       K   EL        Erase line (default: from cursor to end of line).
                     ESC [ 1 K: erase from start of line to cursor.
                     ESC [ 2 K: erase whole line.
    
por 24.06.2016 / 18:58
2

A limpeza no final da linha usará a cor de fundo atual com o console xterm e Linux, bem como os terminais que copiam esse comportamento. Em ncurses que é referido como a capacidade de apagar cores em segundo plano (bce). Quando o recurso é suportado, isso fornece uma maneira de manter o plano de fundo da linha atualmente editada com uma determinada cor.

No entanto:

  • É menos útil ao editar uma linha segmentada.
  • Existem algumas diferenças com os terminais rxvt / urxvt: o recurso de caractere de apagamento (ech) relacionado não usa a cor de plano de fundo. Seu shell pode usar isso ao editar uma linha.
  • Nem todos os terminais usam a cor de fundo atual ao rolar (como fazem o console do xterm e do Linux).

Leitura adicional:

por 24.06.2016 / 22:00
2

Que tal isso:

printf '\e[41m%-*s\e[0m\n' $COLUMNS 'Warning text'

Você também pode criar uma função para receber argumentos, adicionar variáveis de cor, etc:

linecolor () { printf '\e[41m%-*s\e[0m\n' $COLUMNS "$1"; }

uso:

linecolor 'Warning text'
    
por 25.06.2016 / 21:12
0

Se uma linha em branco inicial extra for aceitável:

echo -e "\x1b[41;37m\n\x1b[0m\x1b[41;37mWarning\x1b[0m"; echo "Normal"

parece funcionar.

A única explicação que posso apresentar para o comportamento que vejo é que se resume a como o terminal determina qual cor de fundo usar para uma nova linha, o que tornaria provável que funcione de forma diferente se você usar outro terminal do que o xterm que uso.

Acho que usar printf faz com que o último método seja um pouco mais legível, por isso, mesmo que isso ainda quebre o copiar-colar, aqui vai:

printf "\x1b[41;37m%-$(stty size | cut -d' ' -f2)s\x1b[0m\n" hello; echo world; echo test
    
por 24.06.2016 / 17:03