¿Cómo determinar el color actual de la salida de la consola?


14

Sé que, si hay un terminal de color disponible, se puede colorear la salida con caracteres de escape .

Pero, ¿existe la posibilidad de averiguar en qué color se muestra actualmente la salida? O mejor, ¿de qué color sería el texto si lo imprimiera ahora?

Estoy pidiendo que no rompa ninguna configuración de color anterior, cuando use estos caracteres de escape. El carácter de escape 'color de primer plano predeterminado' es obtener su información del esquema de color, en lugar del color del texto antes de cambiarlo.


Mirando las variables termcap y terminfo parece que no es posible. Por ejemplo, puede obtener el número de colores que admite su terminal con echotc Coo echoti colors, pero simplemente no hay una variable que almacene la definición actual del código de color.
jimmij

@jimmij Pensé que sí y esperaba que me perdiera algo. Si está lo suficientemente seguro de que no es posible, responda y eventualmente lo aceptaré, si nada más lo sigue. Gracias por tu tiempo.
Minix

Respuestas:


10

En general, obtener los colores actuales es imposible. El procesamiento de la secuencia de control de un terminal ocurre "dentro" del terminal, donde sea que esté. Con un emulador de terminal como xtermel integrado en un núcleo del sistema operativo que proporciona los terminales virtuales del núcleo, el estado interno del emulador, incluida su noción de la "representación gráfica" actual (es decir, color y atributos), está en la máquina en sí mismo y es teóricamente accesible. Pero para un terminal real, esta información está en alguna ubicación de RAM en una máquina físicamente separada conectada a través de un enlace en serie.

Dicho esto, algunos terminales incluyen un mecanismo para leer dicha información como parte de su protocolo de terminal, que se envía a través de ese enlace en serie. Proporcionan secuencias de control que un programa puede enviar al terminal, lo que hace que envíe información sobre su estado interno, como entrada del terminal. mikeservle ha mostrado las secuencias de control a las que xtermresponde el emulador de terminal. Pero estos son específicos de xterm. Los emuladores de terminal integrados en el núcleo de Linux y los diversos núcleos BSD son tipos de terminales diferentes, por ejemplo, y no implementan ninguna secuencia de control de este tipo. Lo mismo ocurre con familias enteras de terminales reales.

Los terminales DEC VT525 implementan un mecanismo de lectura, pero tienen un conjunto de secuencias de control que no guardan relación con las utilizadas por xterm. Uno envía la secuencia DECRQSS (Solicitar selección o configuración) para solicitar la representación gráfica actual, y el terminal responde enviando el DECRPSS (Selección o configuración de informe). Específicamente:

  1. El host envía: DCS $ q mST (DECRQSS con la parte de función de control de SGR como configuración)
  2. El terminal responde: DCS 0 $ r 0 ; 3 3 ; 4 4 mST (DECRPSS con los parámetros y la función de control parte de una secuencia de control SGR que establece los colores actuales de primer plano y fondo)

Por supuesto, una lectura cuidadosa de su pregunta revela que está agitando una banana cubierta de chocolate en esos sistemas monetarios europeos nuevamente. Lo que realmente está tratando de hacer, para lo cual seleccionó una solución y luego le preguntó cómo hacer parte de esa solución, es preservar el estado anterior mientras escribe algunos resultados coloreados. No solo hay una secuencia de control DEC VT para hacer esto, también hay una secuencia de terminal de consola SCO que es reconocida por xtermvarios emuladores de terminal incorporados en el kernel y una entrada termcap / terminfo que le dice cuáles son para su terminal.

Las entradas de termcap son scy rc. Las entradas terminfo son save_cursory restore_cursor. Los nombres son algo engañosos en cuanto a su efecto (aunque actúan como una advertencia de que confía en algo que es de facto en lugar de jure ). Las secuencias de control reales de DECSC, DECRC, SCOSC y SCORC también guardan y restauran la representación gráfica actual.

Dado que el artículo al que apuntó se trata de generar secuencias de control a partir de scripts de shell, el comando que está buscando ahora es tput.

Otras lecturas


Gran respuesta. Me alegro de haber regresado por eso. Muchas gracias.
Minix

@Minix: además scy rc, es posible que también desee buscar en el búfer alternativo si su terminal lo admite. Y sí, esta es una gran respuesta. Minix, quizás también mire esto: cómo usar / dev / fb0 como consola desde el espacio de usuario . La noshsuite que recomienda es la suya.
mikeserv

@mikeserv Voy a echar un vistazo, gracias por los enlaces :)
Minix

2
Noté que esto "no tiene relación con los utilizados por xterm"; sin embargo, xterm ha sido compatible con DECRQSS durante bastante tiempo. La parte con respuesta SGR que incluye fechas de color hasta 1996.
Thomas Dickey

2
Consulte Lecturas adicionales , en la documentación de secuencias de control de xterm, que señala que la documentación del VT520 / etc. no estaba disponible cuando xterm comenzó a proporcionar colores DECRQSS(aproximadamente 7 años de retraso ...).
Thomas Dickey

10

En un xtermpuede obtener los códigos de color RGB de color actuales informados al alterar un escape de cambio de color a una consulta. Use el ESC ] Ps m- pero agregue un ?signo de interrogación. De los documentos :

  • Si "?"se proporciona un en lugar de un nombre o especificación RGB, xtermresponde con una secuencia de control de la misma forma que se puede utilizar para establecer el color dinámico correspondiente. Debido a que se puede dar más de un par de número de color y especificación en una secuencia de control, xtermpuede hacer más de una respuesta.
    • P s = 1 0 → Cambiar el color de primer plano del texto VT100 a P t.
    • P s = 1 1 → Cambiar el color de fondo del texto VT100 a P t.
    • P s = 1 2 → Cambiar el color del cursor de texto a P t.
    • P s = 1 3 → Cambiar el color de primer plano del mouse a P t.
    • P s = 1 4 → Cambiar el color de fondo del mouse a P t.
    • P s = 1 5 → Cambiar el color de primer plano de Tektronix a P t.
    • P s = 1 6 → Cambiar el color de fondo de Tektronix a P t.
    • P s = 1 7 → Cambiar el color de fondo resaltado a P t.
    • P s = 1 8 → Cambiar el color del cursor Tektronix a P t.
    • P s = 1 9 → Cambiar el color de primer plano resaltado a P t.

Tengo serias dudas si es probable que esto funcione en otro emulador de terminal, pero en xtermcaso de que corras ...

printf '\033]11;?\007'

... el xtermempujará nuevamente al búfer de entrada de su terminal una secuencia como la siguiente ...

11;rgb:ffff/ffff/ffff

... para el fondo o para el primer plano:

printf '\033]10;?\007'

10;rgb:0000/0000/0000

Entonces, cuando ejecuto printf '\033]10;rgb:8f8f/8f8f/8f8f8f\007, todo el texto en el terminal que anteriormente era "normal" se volvió azul claro. Posteriormente, la ejecución printf '\033]10;rgb:bfbfbf/bfbfbf/bfbfbf\007'vuelve todo el texto azul claro a "normal". ¿Cómo uso este valor para cambiar solo el color del texto en el futuro?
fourpastmidnight

@fourpastmidnight: tal vez clearprimero?
mikeserv

Estoy pensando que no entiendo la documentación. Dice claramente "P s = 1 0 -> cambiar el color de primer plano VT100", y bueno, eso es lo que parece estar haciendo. ;) Pero eso no es lo que esperaba. Puede que necesite usar el valor RGB recuperado de "P s = 1 0; Pt =?" con otro comando escapado para lograr lo que quiero.
fourpastmidnight

Ok, entonces printf '\033]10;?\007'consulta xterm para el color de primer plano actual del terminal. Si su terminal se inició con "normal" (p. Ej. 7 como color de primer plano), pero se ejecuta tput setaf 3antes de ejecutar el printfcomando, el printfcomando anterior aún devuelve "normal", y eso es correcto, porque ese es el color de primer plano actual de su terminal. Lo que esperaba era una forma de recuperar el color actual de la posición actual del cursor para poder guardarlo para "restaurarlo" más tarde, según el OP.
fourpastmidnight

1
@fourpastmidnight - ¿Seguiste el enlace en la respuesta aquí? también, Thomas Dickey - (comentó sobre la otra respuesta a esta pregunta) es xtermel encargado de mantener y es un miembro activo aquí. (el enlace es a su sitio web, xtermlos documentos de escape son extensos, y básicamente la referencia estándar para cualquier otro programador que desee escribir un terminal)
mikeserv
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.