Como alterar a cor de fundo de exatamente uma linha?

Como alterar a cor de fundo de exatamente uma linha?

Aqui estão minhas tentativas:

insira a descrição da imagem aqui

O último funcionou, mas quebra o copiar e colar (adicionando muitos espaços ao copiar). Existe uma maneira melhor?

Texto copiável:

$ 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
$ 

Responder1

Encontrei a solução sozinho (emesta questão relacionada). Usa 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.

Responder2

Limpar até o final da linha usará a cor de fundo atual com xterm e console Linux, bem como terminais que copiam esse comportamento. Em ncurses, isso é conhecido como recurso de apagamento de cor de fundo (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 quebrada.
  • Existem algumas diferenças com os terminais rxvt/urxvt: o recurso de apagamento de caracteres (ech) relacionado não usa a cor 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 xterm e o console Linux).

Leitura adicional:

Responder3

Que tal agora:

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

Você também pode torná-la uma função para receber argumentos, adicionar variáveis ​​de cores, etc:

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

uso:

linecolor 'Warning text'

Responder4

Se uma linha inicial extra em branco 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 encontrar para o comportamento que vejo é que tudo se resume a como o terminal determina qual cor de fundo usar para uma nova linha, o que provavelmente funcionaria de maneira diferente se você usar outro terminal que não o que xtermeu uso .

Acho que usar printftorna o último método um pouco mais legível, então, mesmo que isso ainda interrompa a cópia e colagem, aqui vai:

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

informação relacionada