Acesso programático à cor de fundo atual do xterm?

13

Gostaria de configurar as cores do prompt, .bashrcdependendo das cores usadas para primeiro e segundo plano.

Por exemplo, azul avisa se o fundo é claro e bege se está escuro.

Existe uma maneira de descobrir as configurações atuais em um script?

Variável miserável
fonte

Respostas:

22

O e-mail de Thomas Dickey (mantenedor do xterm) tem isso. Observe em particular a parte sobre ?. A Ps = 4refere-se a OSC Ps ; Pt STem que OSC(o prefixo "Controlo Operating System") é ESC ]e ST(a "cadeia Terminator" sufixo) é \(invertida). Esse 4é um dos subcomandos possíveis para o OSC.

Para toda a paleta, isso pode ser definido / recuperado usando a extensão de cor 88/256. Em ctlseqs.txt, está resumido aqui:

  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.

Um pouco mais tarde nos documentos, há mais subcomandos do OSC, Ps = 10e Ps = 11, e outros.

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

Exemplo - isso consulta o plano de fundo usando Ps = "11"(logo acima) e Pt = "?", conectado ao OSC Ps ; Pt ST. No eco, \033está sendo usado para fuga e \\para a barra invertida final.

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

Resultado:

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

Aviso: a cor retornada não reflete se o vídeo reverso, como -rv, está ativado, e o rastreamento pelas ~ 260 cores disponíveis via OSC 4 ; c ; ? STnão mostra nenhuma que segue o plano de fundo E muda com o vídeo reverso. Como muitos usuários definem um fundo escuro usando just xterm -rv, isso complica determinar se o fundo é realmente escuro ou não. A maioria das cores também não se ajusta -rv.

Um script para fazer a consulta completa e realmente capturar a resposta do 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
fonte
1
Uau ... uma resposta depois de dois anos ... obrigado. Não entendi bem a explicação, mas o exemplo não faz nada para mim ... não ecoa nada.
Variável miserável
Heh. Estou reexecutando-o em um xterm recente - um xterm real - desta vez com todos os meus recursos X removidos (o que significa que produz todos os "f" s para as cores em vez de todos os "0"). Usar / bin / echo ou eco interno do bash funciona bem. O exemplo que tentei foi copiar / colar diretamente da postagem acima. Meu ambiente é o Ubuntu 11.10 (um derivado do Linux / Debian). Não tenho um SO diferente à mão para testar.
Alex North-Keys
Dependendo de como o seu prompt estiver configurado, é possível que ele esteja aterrissando na tentativa do xterm de inserir informações no terminal em resposta à sua consulta. Da perspectiva do seu shell, a resposta do xterm se parece com você, digitando.
Alex North-Keys
1
Hmm, o terminal gnome no Ubuntu 12.04 afirma ser compatível com xterm, mas não imprime nada de volta. Por que é que?
Nik Reiman
1
Agora isso é puro vodu terminal. Excelente resposta.
Qix - MONICA FOI ERRADA EM
0

mais ou menos

coloque as configurações no seu arquivo ~ / .Xdefaults:

xterm*foreground: blue
xterm*background: white

no seu shell você apenas cumprimenta os valores:

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

caso contrário, é muito difícil obter alguns valores internos do xterm.

akira
fonte
Não estou nem usando o X :) Estou usando um rxvt do cygwin que roda sem um servidor X. Além disso, eu gostaria de poder usar cores diferentes em hosts diferentes e para tarefas diferentes, o que exige que eu consulte o termincal para obter configurações.
Variável miserável
bem, você não especificou o seu sistema operacional :)
akira
me desculpe por isso. A razão pela qual eu não especifiquei é porque esperava que a solução se baseasse no eco de algumas seqüências mágicas e na obtenção de informações sobre o stdout.
Variável miserável
bem, o que você "ecoa" normalmente permanece dentro do shell (bash, zsh), não vai para o xterm (exceto na etapa final quando se trata de exibir a saída dos comandos).
Akira
-1 awk é a ferramenta errada para o trabalho.
precisa saber é o seguinte
-1

Na verdade, eu acho que você quer isso:

% xrdb -query

Isso listará as configurações para você. Veja também:

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

Para modificar o tempo de execução, use:

% echo "some*setting: somevalue" | xrdb -merge
g33kz0r
fonte
-querylista todos os recursos. especificar um recurso não funciona no meu ubuntu.
akira
eco "seja qual for" | xrdb -merge
g33kz0r
releia a pergunta: O OP deseja definir as cores do BASH PROMPT de acordo com as configurações do xterm. O OP não deseja alterar os recursos x.
Akira
Veja o comentário dele na sua resposta. Ele quer "consultar o termoincal [sic]". Assim, ele quer xrdb -query
g33kz0r
se você quer ser tão específico: ele quer consultar o rxvt sem um xserver em execução no windows (o que é possível) e xrdb -queryapenas fornece a lista de todos os recursos .. que você precisa ativar / grep novamente para chegar ao primeiro plano. e é isso que eu já admiti. xrdb -mergeé completamente offtopic aqui, porque o OP não deseja modificar os recursos x, mas a aparência do prompt de comando.
akira