¿Cómo cambiar el color de fondo de exactamente una línea?

¿Cómo cambiar el color de fondo de exactamente una línea?

Aquí están mis intentos:

ingrese la descripción de la imagen aquí

El último funcionó, pero interrumpe el proceso de copiar y pegar (agregando muchos espacios al copiar). ¿Existe una mejor manera?

Texto copiable:

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

Respuesta1

Encontré la solución yo mismo (enesta pregunta relacionada). Utilizar esta:

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

La documentación dice 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.

Respuesta2

Al borrar hasta el final de la línea se utilizará el color de fondo actual con xterm y la consola Linux, así como con los terminales que copien ese comportamiento. En ncurses, esto se conoce como capacidad de borrado del color de fondo (bce). Cuando la función es compatible, esto proporciona una manera de mantener el fondo de la línea actualmente editada en un color determinado.

Sin embargo:

  • Es menos útil al editar una línea ajustada.
  • Existen algunas diferencias con los terminales rxvt/urxvt: la capacidad de borrado de caracteres (ech) relacionada no utiliza el color de fondo. Su shell puede usarlo al editar una línea.
  • No todos los terminales usan el color de fondo actual al desplazarse (como lo hacen xterm y la consola Linux).

Otras lecturas:

Respuesta3

Qué tal esto:

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

También puedes convertirlo en una función para tomar argumentos, agregar variables de color, etc.:

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

uso:

linecolor 'Warning text'

Respuesta4

Si se acepta una línea en blanco inicial adicional:

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

parece funcionar.

La única explicación que se me ocurre para el comportamiento que veo es que todo se reduce a cómo el terminal determina qué color de fondo usar para una nueva línea, lo que haría que funcionara de manera diferente si usa otro terminal distinto al que xtermyo uso. .

Creo que usar printfhace que el último método sea un poco más legible, así que aunque esto todavía interrumpe el proceso de copiar y pegar, aquí va:

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

información relacionada