
Aquí están mis intentos:
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 xterm
yo uso. .
Creo que usar printf
hace 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