Lee el color del texto actual en un xterm

Estoy escribiendo varias utilidades, y realmente me gusta el texto coloreado. Nada de lujos, solo usar secuencias de escape. He creado una clase simple que tiene una función de pprint (msg, color). Lo tengo funcionando bastante fácilmente después de encontrar los códigos aquí .

El problema que tengo es que debería poder apagar el color después de imprimir. Por ejemplo, digamos que un usuario ejecuta mi progtwig que imprime casi todo en el color de terminal predeterminado, pero hay un error y quiero imprimir el error en rojo. Prefijo mi mensaje de error con ‘\ 033 [0; 32m’, y el mensaje está en rojo. Desafortunadamente, todo el texto es rojo hasta que lo cambie. Generalmente está bien mientras mi progtwig se está ejecutando porque sé de qué color deben ser los mensajes. Sin embargo, el color permanece después de que mi progtwig termina. Básicamente, me gustaría leer el color actual cuando se inicie mi progtwig y restaurarlo cuando termine. De la misma manera que los scripts restauran el pwd al salir.

¿Cómo leo la secuencia de escape actual?

Sistema: Red Hat 5.x Bash Python 2.3

Gracias por la ayuda.

    No creo que eso sea posible y es poco probable que sea portátil si lo fuera. Lo mejor que puedes hacer es enviar sgr0 que restablece todos los atributos a los sgr0 predeterminados (no los anteriores). En xterms, sgr0 es Esc[m . Si desea restablecer los colores y no afectar a otros atributos, envíe op que en xterms es Esc[39;49m .

    Estos códigos no deben estar codificados. Debe utilizar terminfo, termcap o [n] curses.

    En lugar de usar secuencias de escape tput , use la función tput lugar. Aquí hay un extracto de mi ~/.bashrc que uso para mi indicador de PS1:

     BLACK=$(tput setaf 0) RED=$(tput setaf 1) GREEN=$(tput setaf 2) YELLOW=$(tput setaf 3) LIME_YELLOW=$(tput setaf 190) POWDER_BLUE=$(tput setaf 153) BLUE=$(tput setaf 4) MAGENTA=$(tput setaf 5) CYAN=$(tput setaf 6) WHITE=$(tput setaf 7) BRIGHT=$(tput bold) NORMAL=$(tput sgr0) BLINK=$(tput blink) REVERSE=$(tput smso) UNDERLINE=$(tput smul) 

    Para restablecer la información de color de modo que el texto posterior esté en el color del terminal normal, usted agregaría ${NORMAL} al final de la siguiente manera:

    echo "${RED}this is red ${NORMAL}this is normal"

     RED = 31 GREEN = 32 ESCAPE = '%s[' % chr(27) RESET = '%s0m' % ESCAPE FORMAT = '1;%dm' def colorize(text, color): return ESCAPE + (FORMAT % (color, )) + text + RESET 

    Esta función devolverá una cadena que se imprimirá en color, y el terminal se restablecerá automáticamente después.

    En realidad, es posible – para xterm , y terminales compatibles .

    xtermcontrol, por ejemplo, utiliza la secuencia de control OSC 10 para recuperar los colores de fondo / fondo predeterminados . Se ha documentado en xterm desde 2002.

    Para otros terminales:

    • En RHEL 5, el progtwig “Terminal” es gnome-terminal 2.16.0; esa versión no reconoce OSC 10 (probado con el equivalente de CentOS 5).
    • La pregunta se hizo en 2010, refiriéndose a la versión empresarial de Red Hat, que, en todo caso, es más lenta de actualizar que Debian.
    • Avanzando en el tiempo, gnome-terminal 3.4.1.1 en Debian 7 (principios de 2012) tampoco reconoció la secuencia de control.
    • Finalmente, en Debian 8 con 3.14.1 (finales de 2014) se reconoce la característica.
    • El terminal gnomo 3.14.3 de CentOS 7 reconoce la secuencia de control.

    Curioso cuando se agregó, tenga en cuenta que los desarrolladores de VTE no escriben documentación. Así que … estudiando los shows de log de git

     commit 1b8c6b1aac587b79476a60a5830385abc939430d Author: Egmont Koblinger  Date: Wed Jan 22 00:13:51 2014 +0100 emulation: Add support for OSC 1?1[017] (fg, bg, highlight colors) https://bugzilla.gnome.org/show_bug.cgi?id=567444 

    Por otro lado, los colores predeterminados no son los mismos que los colores actuales . Los usuarios han podido hacer esto con xterm desde el parche # 93 en 1999 usando la secuencia de control DECRQSS . Es decir, poner el terminal en modo raw y hacer algo como

     printf '\033P$m\033\\' 

    obtendría que responda con la cadena rellenada con los parámetros de SGR.

    Si los colores se establecieron utilizando SGR, esos códigos serían parte de la respuesta, por ejemplo,

     \033P1$r0;33m\033\\ 

    para denotar el color de primer plano número 3 (codificado como 33 ).

    Podría detenerse allí (porque podría extraer esos parámetros y reutilizarlos para establecer el terminal en el mismo estado más adelante), pero luego sería posible obtener los colores RGB reales utilizando OSC 4 . Usaría el número de color (de la secuencia de SGR) y enviaría algo como esto:

     printf '\033]4;3;?\033\\' 

    Así que ciertamente es factible con xterm. Habrá una demostración / script de prueba para DECRQSS en la próxima actualización para xterm.

    Para otros progtwigs, necesitas más tiempo:

    • El desarrollador de DECRQSS pasó DECRQSS alto DECRQSS (no tiene ninguna función para configurar / obtener códigos SGR).

    • Los desarrolladores de VTE copian las características de xterm en respuesta a los informes de errores; la fuente de VTE no menciona DECRQSS . Su registro de git menciona OSC 4 en 2009, pero la implementación está incompleta (solo permite establecer un color, no obtener el color).