Sequência de controle Xterm para obter valor RGB para cor ANSI

3

A carne

Em alguns terminais, você pode usar uma sequência como essa:

printf "\e]4;3;rgb:cc/78/33\e\"

para definir a terceira cor na paleta de cores ANSI para os valores RGB representados por # CC7833. Você pode fazer o oposto? Posso obter o valor RGB atual (em qualquer forma) da terceira (bem, qualquer realmente) cor?

Por quê?

O motivo pelo qual você gostaria de fazer isso, no meu caso, é salvar toda a tabela de cores antes de atrapalhar (propositalmente). Eu quero ser capaz de listar o código no terminal usando um tema de cores exatas RGB, me chame de anal. Para fazer isso eu tenho que substituir as definições de cores na tabela de cores do terminal, conforme acima.

Para mim, o problema está resolvido agora. Mas como quero adicionar essa funcionalidade a um projeto de código aberto existente que é usado por muitas pessoas, preciso salvar o estado atual da paleta de cores antes de definir as cores do tema para a sessão de programas e depois alterná-las. volta depois.

Eu sei que alguns terminais têm isso nas configurações e alguns sistemas têm em arquivos de configuração. Mas eu preciso de algo que seja geral e funcione em todos os sistemas. Idealmente, todos os sistemas que suportam defini-los da maneira acima:)

Bônus

Neste momento, a mudança de cores afeta todo o sistema, todas as sessões de terminal, mesmo depois de fechar e reiniciar o terminal (isso é usando o iTerm2 no OS X Mountain Lion).

Se o efeito pudesse ser feito local, digamos, para um sub shell, o problema desapareceria, já que as mudanças morreriam com o sub shell quando o processo terminasse. Melhor ainda, pois protegeria contra casos em que a sessão caiu ...

    
por Jonas Schubert Erlandsson 18.09.2013 / 16:18

3 respostas

2

O mais próximo de um método padrão para isso que eu posso pensar seria confiar no xrdb. Você pode usar xrdb -query e obter os valores de cores usados pela sessão X atual. Por exemplo, o meu fornece o seguinte:

*background:    #151515
*color0:    #101010
*color1:    #E84F4F
*color10:   #A0CF5D
*color11:   #F39D21
*color12:   #4E9FB1
*color13:   #8542FF
*color14:   #42717B
*color15:   #dddddd
*color2:    #B8D68C
*color3:    #E1AA5D
*color4:    #7DC1CF
*color5:    #9B64FB
*color6:    #6D878D
*color7:    #dddddd
*color8:    #404040
*color9:    #D23D3D
*foreground:    #D7D0C7
...
Infelizmente, devido à maneira como o xrdb funciona, não tenho conhecimento de nenhuma maneira de definir apenas as configurações de um sub-shell, já que o ponto inteiro do xrdb é coordenar as configurações para a sessão x atual. No entanto, você pode "atacar" ao exportar as configurações via xrdb -query e, em seguida, recarregá-las quando terminar.

    
por 10.10.2013 / 19:40
2

Você pode consultar a cor com

printf "\e]4;3;?\e\"

que coloca a resposta no buffer do teclado como se você tivesse digitado no terminal (o que é difícil de processar em shell scripts). Ou você pode usar

xtermcontrol --get-color3

qual o front-end de conveniência que usa essa seqüência de escape.

    
por 23.04.2015 / 18:04
0

A maneira clássica que usei foi definir um conjunto de propriedades xrdb para uma nova classe --- assim: (no linux você tem que colocar em $ HOME / .Xdefault- hostname , YMMV)

MYXTerm*foreground: red;
MYXTerm*color11: navyblue;

e, se necessário (não tenho certeza, depende do sistema), carregando o arquivo usando xrdb -merge . Depois disso, iniciando um terminal com:

xterm -class MYXTerm

Agora você deve ter um terminal com um conjunto de cores privadas que não afetam as cores normais. Agora, se o que você quer é rodar seu programa no mesmo terminal , eu realmente não sei como fazer isso ...

    
por 11.10.2013 / 17:02