¿Cómo puedo cambiar los colores de mi xterm usando secuencias de escape Ansi?

25

Me gustaría cambiar los colores (fondo, fuente, primer plano) de mi xterm desde la línea de comandos. He oído que esto se puede hacer usando secuencias de escape ANSI.

Si esto es posible:

  • Como se hace
  • ¿Puedo usar nombres de colores o debo usar sus códigos RGB?
Nathan Fellman
fuente

Respuestas:

27

Las secuencias de escape ANSI consisten en una secuencia de caracteres que comienza con el carácter Escape, carácter 27. El siguiente carácter es a menudo (aunque no siempre) un corchete abierto: [

El comando echo puede enviar caracteres de escape si especifica -ey usa \epara escape.

El estándar ANSI define 8 colores, más un modo brillante, que da un total de 16 posibilidades. La secuencia es:

\e[<number>m

¿Dónde <number>está uno de:

Primer plano:

  • 30 negro
  • 31 rojo
  • 32 verde
  • 33 amarillo
  • 34 azul
  • 35 magenta
  • 36 cian
  • 37 blanco

Fondo:

  • 40 negro
  • 41 rojo
  • 42 verde
  • 43 amarillo
  • 44 azul
  • 45 magenta
  • 46 cian
  • 47 blanco

  • 0 Restablecer todo

  • 1 negrita

Entonces, para que su primer plano sea rojo y su fondo amarillo:

$ echo -e "\e[31m\e[43m"

Y para habilitar negrita:

$ echo -e "\e[1m"

Por supuesto, puedes combinarlos todos juntos:

$ echo -e "\e[31m\e[43m\e[1m"

Existen muchos otros códigos de escape para hacer otras cosas.

Por ejemplo, borre la pantalla y mueva el cursor hacia la esquina superior izquierda:

$ echo -e "\e[2J\e[1;1H"

Lo cual es útil al cambiar el color:

$ echo -e "\e[31m\e[43m\e[1m\e[2J\e[1;1H"

Lo que cambiará los colores, borrará la pantalla y colocará el cursor en la esquina superior izquierda. Bueno, casi arriba a la izquierda. Echo coloca un retorno de carro, por lo que se mueve hacia abajo una línea. Puede agregar -na echo para evitar esto si es quisquilloso.

Si lo estropea todo y no puede ver lo que está escribiendo, puede restablecer los colores del terminal a la normal presionando:

Ctrl+v [ 0 m Return

En lo que esperas es el símbolo del sistema. Se informará sobre un comando desconocido, pero podrá ver lo que está haciendo nuevamente.

Majenko
fuente
¿Puedo usar nombres de colores en lugar de códigos de colores?
Nathan Fellman el
1
No, pero puede asignar los códigos de color a las variables. FGRED = 31; echo -e "\ e [$ {FGRED} m"
Majenko
3
Sin embargo, debe tenerse en cuenta que varios números de código de color se pueden separar por ";" Entonces, para que su primer plano sea rojo y su fondo amarillo, también puede usar el más corto: echo -ne '\e[31;43m'(en lugar del anterior echo -e "\e[31m\e[43m").
Andreas Spindler
¿Cómo cambio el color del cursor a 34 azul?
trusktr
28

¡Tenga en cuenta que los Xterms modernos admiten el color de 32 bits!

Ejemplo simple. Para establecer un bonito fondo morado oscuro (oye, cada uno a su propio) de valor # 53186f, debes:

echo -ne "\033]11;#53186f\007"

Tenga en cuenta que esto cambia instantáneamente el color de toda la ventana, no solo del texto posterior. Esto es especialmente bueno para hacer una ventana obviamente diferente después de enviar un mensaje a un servidor (por ejemplo). Ponga el 'echo' anterior en su .bashrc y su terminal cambiará automáticamente los colores cuando inicie sesión en ese servidor (pero no volverá a cambiar cuando cierre Ctrl-D)

Puede pasar HORAS en la red buscando esto: la mayoría de los documentos solo hablan de los 16 colores ANSI originales.

Fuentes: http://www.steike.com/code/xterm-colors/ y http://rtfm.etla.org/xterm/ctlseq.html (consulte "Controles del sistema operativo")

Tenga en cuenta: la secuencia de escape anterior es válida para XTerms, y puede no funcionar para otras implementaciones de emuladores de terminal de ventanas "tipo XTerm" que pueden "verse" como un XTerm. Por ejemplo, "gnome-terminal" o "konsole" tienen diferentes secuencias de escape, o pueden no implementar ningún cambio de color.

Greg
fuente
1
Esto no funciona para mí, tiene una línea en blanco sin cambios observables en la terminal.
Richard
1
Esto funcionó para mí, mientras que los otros no - muy útil, gracias
vol7ron
1
+1 cambia el fondo de la ventana y permite nombres de colores, como "verde" en lugar de "# 00ff00".
Rob I
1
¿Cómo es # 53186f colores de 32 bits.
Cuento
¿Alguien sabe cómo lograr lo mismo con gnome-terminal?
wjandrea
3

Sí. Los terminales ANSI admiten códigos de escape ANSI . Cada Control Sequence Introducer( CSI) Código en el siguiente formato:

ESC[<<<CODE>>>

El carácter Ascii 27(el ESCcarácter) o 1ben hexadecimal, seguido de un corchete izquierdo y luego una letra que indica la acción que se utilizará.

Tenga en cuenta que ;se puede proporcionar una lista de parámetros separados directamente antes del <<<CODE>>>parámetro.

Ahora, los colores usan un subconjunto de CSIcódigos, los Select Graphic Renditioncódigos. Estos están en la forma:

ESC[<<<SGR>>>m

El SGRcódigo se pasa como parámetro el CSI. Relevantes para su pregunta son los SGRcódigos 30-49. Los códigos 30-39 establecen el color de primer plano. Los códigos 40-49 establecen el color de fondo.

30 - Foreground Black
31 - Foreground Red
32 - Foreground Green
33 - Foreground Yellow
34 - Foreground Blue
35 - Foreground Magenta
36 - Foreground Cyan
37 - Foreground White

40 - Background Black
41 - Background Red
42 - Background Green
43 - Background Yellow
44 - Background Blue
45 - Background Magenta
46 - Background Cyan
47 - Background White

Los códigos 38 y 48 son códigos especiales. Estos son los que le permiten usar valores RGB. El formato para estos es:

ESC[38;2;<r>;<g>;<b>m (Foreground)
ESC[48;2;<r>;<g>;<b>m (Background)

Nota: los usos alternativos incluyen \x1b[<3 or 4>8;5;<web safe color index>m. Con este uso, hay una codificación de color completamente diferente. Consulte el enlace en la parte superior de esta respuesta para obtener más información.

Los códigos 39 y 49 establecen los colores de primer plano y de fondo a sus valores predeterminados, que se definen terminal por terminal.

En la práctica, los colores 30-37 40-47 son ligeramente diferentes de lo que sus etiquetas dicen que son.

0 - Black
1 - Darker Red
2 - Darker Green
3 - Dark/Yellow or Brown (varies between terminals)
4 - Dark Blue
5 - Dark Magenta
6 - Dark Cyan
7 - Light Grey

Para obtener los colores claros, se utiliza la SGI para negrita, 1. Negrita es un nombre engañoso. No pone la fuente en negrita. Realmente aumenta el brillo del texto. Con negrita aplicada los colores se convierten en:

0 - Dark Grey
1 - Bright Red
2 - Bright Green
3 - Bright Yellow
4 - Bright Blue
5 - Bright Magenta
6 - Bright Cyan
7 - White

Aviso: los dos últimos bloques de números de colores son relevantes tanto para fore- como para background ( <index> + (30 or 40)).

Para eliminar todos los estilos (volver al modo predeterminado / normal) use SGR0.

CSILos códigos no son todos gráficos. Por ejemplo, ESC[2Jborrará su terminal. ESC[<y>;<x>Hestablece la posición del cursor (1 indexado). Vea el artículo de Wikipedia para más información.

Nota: para probar esto, use echo -eo printf.

Élektra
fuente
2

NOTA: "^ [" es el carácter de escape y se inserta con un CTRL-V, CTRL- [y ^ G es un carácter de campana, insertado con CTRL-V, CTRL-G

El siguiente bloque está en mi .bash_profile y garantiza que mis xterms en este sistema SIEMPRE sean blanco sobre negro, incluso después de iniciar sesión en otro sistema que puede haber cambiado mis colores.

perl -e '$e=chr(27);print "${e}[37m ${e}[40m ${e}[2J ${e}[1;1H";'
export PS1='^[[37m^[]0;${HOST}: ${PWD}^G^[[40m${USER}@${HOST}:${PWD}
--> '
Micro
fuente
0

compruebe también un proyecto ScriptEchoColor
, está completamente hecho en scripts de bash
, tiene paquetes para ubuntu aquí,
pero estos scripts se pueden instalar en cualquier distribución si sabe cómo hacerlo (lo último también se puede descargar desde su git).

puede usar nombres de color acortados o extendidos como:

echoc "@rRedFg@{/blue}BlueFg@{/GREEN}GreenBg"

una muestra: ingrese la descripción de la imagen aquí

Además, asegúrese de echar un vistazo a xtermcontrol , para un control más extenso sobre el xterm en sí mismo (no solo los caracteres).

Poder de acuario
fuente
0

Entre los muchos códigos ANSI CSI se encuentra uno llamado SGR, o Seleccionar representación gráfica. Esto es ESC, [parámetros, mdonde los parámetros son uno o más enteros en formato ASCII, separados por punto y coma. Los diferentes parámetros de SGR se enumeran en la página de Wikipedia anterior (aunque no se detalla en detalle para todos ellos).

Algunos parámetros, como 1(negrita o mayor intensidad) y 31(texto rojo) son independientes, y se pueden usar individualmente o combinados, como en ESC[31mo ESC[1;31mpara dar texto estándar rojo y negrita en primer plano, respectivamente.

Otros toman parámetros ellos mismos, que simplemente se proporcionan después del código como más números separados por punto y coma. Entonces, por ejemplo, ESC[38;5;219mmostraría el texto de primer plano en el número de color extendido 219, y ESC[38;2;150;100;50mlo mostraría en el color con valor RGB 150, 100, 50. En este caso, 38es el comando "color de primer plano de conjunto extendido", que siempre es seguido por un subcomando El subcomando 2toma tres parámetros, los valores de los componentes rojo, verde y azul. De manera diferente, el subcomando 5toma solo un valor más, un número de 0 a 255 que especifica un color de una tabla con la que está configurado el terminal.

La siguiente función de shell puede ser útil para usar estos códigos:

sgr() {
    local codes=${1:-0}; shift
    for c in "$@"; do codes="$codes;$c"; done
    echo -n -e "\e[${codes}m"
}

Puedes usarlo así:

normal=$(sgr 0)
red=$(sgr 31)
echo "Text can be $(sgr 1)made boldface$(sgr 0)" \
     " or ${red}colored red${normal}" \
     " or $(sgr 31 1)even both at the same time$(sgr)."

Tenga en cuenta que si no le da parámetros sgr(), el valor predeterminado es el código SGR 0, lo que significa desactivar todos los atributos y restablecer el texto al valor predeterminado para ese terminal.

Curt J. Sampson
fuente
1
Técnicamente los ESC[38... my ESC[38... mlata / debería (depende de su fuente de información - lo último un ser, yo creo, itu.int/rec/T-REC-T.416-199303-I ) debe utilizar el, de lo contrario, carácter reservado :(para separar los elementos del parámetro ) de modo que ;solo se use entre cadenas de parámetros completas , es decir, ESC[38;2;150;100;50mdebe escribirse ESC[38:2::150:100:50m...
SlySven
... desafortunadamente, las implementaciones a menudo olvidan la identificación del espacio de color entre el 2y el 150- ya que nadie, que yo sepa , ha definido qué valor debe entrar allí, se usará el valor predeterminado vacío, pero a menudo se omite y usar solo ;como separador hace que sea imposible procesar de manera confiable la información de acuerdo con la especificación.
SlySven