variável de ambiente comum para definir o fundo do terminal escuro ou claro

3

Eu escrevi um número de depuradores que todos podem colorir o texto do código-fonte mostrado em uma sessão de terminal. Todos eles entendem que alguns terminais têm um fundo escuro e alguns têm um fundo claro e claro que as cores precisam ser diferentes dependendo do esquema de terminais.

É chato ter que configurar o outro esquema quando seu terminal não corresponde ao plano de fundo padrão, então eu gostaria de encontrar uma maneira de descobrir isso automaticamente. Sugestões? (Todos eles suportam opções --highlight={light|dark|plain} )

Um mecanismo simples seria desativar uma variável de ambiente. Para meus perfis de shell, usei DARK_BACKGROUND_COLOR , mas se já houver algum tipo de nome padrão, como há para PAGER , EDITOR , SHELL , HOME etc., eu gostaria de Use isso.

Existe tal convenção de nomes de ambiente? Outras sugestões?

    
por rocky 25.11.2015 / 12:37

3 respostas

5

Não há nenhum. Você é livre para fazer sua própria convenção.

Alguns programas (como xterm ) podem fornecer um aplicativo com cores de primeiro plano e de fundo definidas no momento. "cores dinâmicas" ). Mas, além de aplicativos como o xtermcontrol , poucos fazem uso dele. O Emacs consulta a cor de fundo atual para definir seu parâmetro background-mode terminal, que determina se deve ser aplicada a versão “escura” ou “clara” do tema de cores. Por outro lado, o Vim, que pode usar as seqüências de controle xterm para o número de cores e as strings enviadas por chaves especiais (veja "Request Termcap / Terminfo String" em Sequências de controle do XTerm ), não detecta o senso de primeiro plano / plano de fundo cores.

    
por 25.11.2015 / 12:53
3

Não existe tal convenção. Além disso, uma variável de ambiente não é uma boa maneira de relatar informações sobre um terminal, porque o valor pode ficar obsoleto se um programa iniciar outro emulador de terminal que não atualize essa variável ou se um programa se conectar a vários terminais.

(A variável de ambiente TERM não sofre com esses problemas porque é universal: cada emulador de terminal a configura e todo programa está ciente disso. Os problemas só surgem quando uma variável é parcialmente suportada.)

O caminho certo para obter as informações seria consultar o terminal. No mundo unix, isso é feito escrevendo uma sequência de escape que o terminal interpreta como “envie de volta alguns dados que respondam a minha consulta”. Como Thomas Dickey explica , o xterm tem essa sequência de controle , OSC 11 ; ? BEL (definir parâmetros de texto, parâmetro 11 = cor de fundo do texto, valor ? significa consulta em vez de definir). Escreva \e]11;?\a para o terminal (onde \e é o caractere de escape ( ^[ ) e \a é o caractere da campainha ( ^G )), e xterm responde com uma string como \e]11;rgb:0000/0000/0000\a fundo). Infelizmente, poucos outros emuladores de terminal suportam essa sequência de escape.

Rxvt define a variável de ambiente COLORFGBG como uma string como 7;0 , em que 7 é a cor do primeiro plano (7 é cinza claro) e 0 é a cor do plano de fundo (preto). O Konsole também suporta isso.

O Emacs tenta detectar se o terminal tem um fundo claro ou escuro, a fim de definir os background-mode terminal parameter . A partir do Emacs 24.5, existem três métodos para definir o modo de fundo automaticamente:

  • Em xterm , o Emacs usa o OSC 11 sequência de escape, conforme explicado acima.
  • Em rxvt , o Emacs usa o COLORFGBG variável de ambiente, como explicado acima.
  • Em DOS e Windows consoles, o Emacs usa interfaces específicas do SO para obter informações sobre o terminal; essas interfaces desempenham o mesmo papel que a seqüência de escape OSC 11 .

Isso deixa muitos terminais, no entanto, há algum progresso: a biblioteca vte, que alimenta muitos emuladores de terminal, como gnome-terminal, guake, terminator, xfce4-terminal,…, implementa OSC 11 reportando como xterm desde a versão 0.35.2 . Você pode detectar terminais baseados em VTE verificando a variável de ambiente VTE_VERSION ; o valor é um número, você quer 3502 e acima.

Se você quiser padronizar de maneira a relatar as informações aos aplicativos, o suporte no lado do terminal pode não importar: afinal, você sabe se prefere fundos claros ou escuros. Então você pode também alinhar com rxvt e usar COLORFGBG , já que é a única interface que alguém já está usando e que você pode adotar independentemente de qualquer suporte de terminal. A interface COLORFGBG é limitada: foi concebida para um mundo com apenas 16 cores e todos concordam com um mapeamento a partir dos números das cores para cores (pelo menos aproximadamente, os matizes exatos diferem). O Konsole suporta mais de 16 cores, mas usa uma aproximação ao reportar COLORFGBG : aproxima as cores do primeiro plano e do segundo plano por uma das 16 cores padrão. Se tudo o que importa é claro ou escuro, isso não é um problema, basta definir COLORFGBG a 15;0 para texto claro em um fundo escuro ou 0;15 para texto escuro em um fundo claro.

    
por 26.11.2015 / 02:21
2

Com base nas respostas bem pensadas por Thomas Dickey e Gilles Eu colei juntos este script no github .

O ponto crucial é usar a consulta de cores compatível com xterm e, com base nos valores de cores RGB, ver se o fundo é escuro. Se isso não funcionar, tente interpretar COLORFGBG e, se não, usar padrões predefinidos para vários terminais. Por exemplo, o xterm é um plano de fundo claro por padrão.

O código para os padrões pré-definidos e a interpolação RGB claro / escuro foi derivado do código GNU emacs (como sugerido por Gilles).

Eu não adicionei nenhum código específico do MS Windows, mas as pessoas devem se sentir livres para enviar solicitações de pull para lidar com isso ou para adicionar outras correções.

    
por 24.12.2015 / 15:20