¿Acceso programático al color de fondo xterm actual?

13

Me gustaría configurar los colores de solicitud en .bashrcfunción de los colores que esté utilizando para el primer plano y el fondo.

Por ejemplo, azul si el fondo es claro y beige si está oscuro.

¿Hay alguna manera de averiguar la configuración actual en un script?

Variable miserable
fuente

Respuestas:

22

El correo electrónico de Thomas Dickey (mantenedor de xterm) tiene esto. Tenga en cuenta en particular la parte sobre ?. Se Ps = 4refiere a OSC Ps ; Pt STdónde está OSC(el prefijo "Control del sistema operativo") ESC ]y ST(el sufijo "Terminador de cadena") es \(barra diagonal inversa). El 4es uno de los posibles subcomandos para OSC.

Para toda la paleta, eso se puede configurar / recuperar utilizando la extensión de color 88/256. En ctlseqs.txt, se resume aquí:

  Ps = 4 ; c ; spec -> Change Color Number c to the color
specified by spec.  This can be a name or RGB specification as
per XParseColor.  Any number of c/spec pairs may be given.
The color numbers correspond to the ANSI colors 0-7, their
bright versions 8-15, and if supported, the remainder of the
88-color or 256-color table.

If a "?" is given rather than a name or RGB specification,
xterm replies with a control sequence of the same form which
can be used to set the corresponding color.  Because more than
one pair of color number and specification can be given in one
control sequence, xterm can make more than one reply.

Un poco más tarde en los documentos son más subcomandos OSC, Ps = 10y Ps = 11, entre otros.

Ps = 1 0  -> Change VT100 text foreground color to Pt.
Ps = 1 1  -> Change VT100 text background color to Pt.

Ejemplo: esto consulta el fondo usando Ps = "11"(desde arriba) y Pt = "?", conectado al OSC Ps ; Pt ST. En el eco, \033se está utilizando para escapar y \\para la barra invertida final.

echo -en "\033]11;?\033\\"

Salida:

^[]11;rgb:0000/0000/0000^[\ 

Advertencia: el color devuelto no refleja si el video inverso, como -rv, está habilitado, y el rastreo a través de los ~ 260 colores disponibles OSC 4 ; c ; ? STno muestra ninguno que siga el fondo Y cambie con el video inverso. Dado que muchos usuarios establecen un fondo oscuro usando solo xterm -rv, esto complica determinar si el fondo es realmente oscuro o no. La mayoría de los colores tampoco se ajustan a -rv.

Un script para hacer la consulta completa y capturar la respuesta de xterm:

#!/bin/bash
success=false
exec < /dev/tty
oldstty=$(stty -g)
stty raw -echo min 0
col=11      # background
#          OSC   Ps  ;Pt ST
echo -en "\033]${col};?\033\\" >/dev/tty  # echo opts differ w/ OSes
result=
if IFS=';' read -r -d '\' color ; then
    result=$(echo $color | sed 's/^.*\;//;s/[^rgb:0-9a-f/]//g')
    success=true
fi
stty $oldstty
echo $result
$success
Alex North-Keys
fuente
1
Wow ... una respuesta después de dos años ... gracias. No entendí bien la explicación, pero el ejemplo no hace nada para mí ... no tiene eco
Variable miserable
Je Lo vuelvo a ejecutar en una xterm bastante reciente, una xterm real, esta vez con todos mis recursos X eliminados (lo que significa que produce todas las "f" para los colores en lugar de todos los "0" s). El uso de / bin / echo o bash echo incorporado funciona bien. El ejemplo que probé fue copiar / pegar directamente de la publicación anterior. Mi entorno es Ubuntu 11.10 (un derivado de Linux / Debian). No tengo un sistema operativo diferente a mano para probar.
Alex North-Keys el
Dependiendo de cómo se configure su solicitud, existe la posibilidad de que aterrice por encima del intento de xterm de ingresar datos en su terminal en respuesta a su consulta. Desde la perspectiva de su shell, la respuesta de xterm simplemente se parece a usted, escribiendo.
Alex North-Keys el
1
Hmm, el terminal gnome en Ubuntu 12.04 dice ser compatible con xterm, pero no imprime nada. ¿Porqué es eso?
Nik Reiman
1
Ahora bien, esto es puro vudú terminal. Excelente respuesta
Qix - MONICA FUE MALTRATADA el
0

mas o menos

ponga la configuración en su archivo ~ / .Xdefaults:

xterm*foreground: blue
xterm*background: white

en su shell simplemente grep los valores:

awk '/xterm\*foreground:(.*)/ { print $2 }' < .Xdefaults

de lo contrario, es bastante difícil obtener algunos valores internos de xterm.

akira
fuente
Ni siquiera estoy usando X :) Estoy usando un rxvt de cygwin que se ejecuta sin un servidor X. Además, me gustaría poder usar diferentes colores en diferentes hosts y para diferentes tareas, lo que requiere que consulte el terminal para la configuración.
Variable miserable
bueno, no especificaste tu sistema operativo :)
akira
Lo siento por eso. La razón por la que no especifiqué es porque esperaba que la solución se basara en hacer eco de algunas cadenas mágicas y recuperar información en stdout.
Variable miserable
bueno, lo que "echo" normalmente permanece dentro del shell (bash, zsh), no va a xterm (excepto en el paso final cuando se trata de mostrar la salida de los comandos).
akira
-1 awk es la herramienta incorrecta para el trabajo.
g33kz0r
-1

En realidad creo que quieres esto:

% xrdb -query

Eso enumerará las configuraciones para usted. Ver también:

http://docstore.mik.ua/orelly/unix3/upt/ch06_08.htm

Para modificar el tiempo de ejecución, use:

% echo "some*setting: somevalue" | xrdb -merge
g33kz0r
fuente
-queryenumera todos los recursos. especificar un recurso no funciona en mi ubuntu.
akira
echo "lo que sea" | xrdb -merge
g33kz0r
releer la pregunta: OP quiere establecer los colores de BASH PROMPT de acuerdo con la configuración de xterm. OP no quiere cambiar los recursos de x.
akira
Vea su comentario a su respuesta. Quiere "consultar el término [sic]". Por lo tanto, quiere xrdb -query
g33kz0r
si quieres ser así de específico: quiere consultar rxvt sin un servidor x en ejecución en Windows (lo cual es posible) y xrdb -querysolo te da la lista de todos los recursos ... que tienes que hacer awk / grep nuevamente para llegar al primer plano. y eso es lo que ya admití. xrdb -mergeestá completamente fuera de tema aquí porque OP no quiere modificar los recursos x pero la apariencia de bashprompt.
akira