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.
colors
console
escape-characters
Minix
fuente
fuente
echotc Co
oechoti colors
, pero simplemente no hay una variable que almacene la definición actual del código de color.Respuestas:
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
xterm
el 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.
mikeserv
le ha mostrado las secuencias de control a las quexterm
responde el emulador de terminal. Pero estos son específicos dexterm
. 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:$
q
m
ST (DECRQSS con la parte de función de control de SGR como configuración)0
$
r
0
;
3
3
;
4
4
m
ST (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
xterm
varios 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
sc
yrc
. Las entradas terminfo sonsave_cursor
yrestore_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
fuente
sc
yrc
, 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 . Lanosh
suite que recomienda es la suya.DECRQSS
(aproximadamente 7 años de retraso ...).En un
xterm
puede obtener los códigos de color RGB de color actuales informados al alterar un escape de cambio de color a una consulta. Use elESC ] Ps m
- pero agregue un?
signo de interrogación. De los documentos :"?"
se proporciona un en lugar de un nombre o especificación RGB,xterm
responde 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,xterm
puede hacer más de una respuesta.Tengo serias dudas si es probable que esto funcione en otro emulador de terminal, pero en
xterm
caso de que corras ...... el
xterm
empujará nuevamente al búfer de entrada de su terminal una secuencia como la siguiente ...... para el fondo o para el primer plano:
fuente
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ónprintf '\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?clear
primero?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 ejecutatput setaf 3
antes de ejecutar elprintf
comando, elprintf
comando 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.xterm
el encargado de mantener y es un miembro activo aquí. (el enlace es a su sitio web,xterm
los documentos de escape son extensos, y básicamente la referencia estándar para cualquier otro programador que desee escribir un terminal)