tmux, suporte a TERM e 256 cores

44

Introdução

Minha pergunta surge da necessidade de entender por que tenho agora (depois de várias tentativas) Terminal e tmux suportando 256 cores e tput colors informando que existem apenas 8 delas.

Antecedentes

Vamos começar do começo.

Estou usando uma caixa Ubuntu , Guake , tmux , Vim e adoro o tema < em> Solarizado . Eles estavam parecendo horríveis, então decidi ativar o suporte a 256 cores e brincar um pouco.

Vamos ver o que acontece com o meu Terminal . tput colors diz que há 8 cores. Eu pessoalmente os coloquei em roxo, à esquerda, e claro à direita nós temos 2 diferentes tons de azul. $TERM diz xterm . (Para ter o colorido ls I eval isso no meu .bashrc .)

Vimtambémparecebem,apesardofatodeeuchamá-locomosinalizador256emumambientenoqual256coressãonãosuportadas.

sett_Co=256letg:solarized_termcolors=256colorschemesolarized

Oúnicocaraquereclamadoespaçodecoresreduzidoéotmux.Chamartmuxforneceosresultadosesperados"errados".

Maschamartmuxcomabandeira-2faztudofuncionarbem,magicamente.

Agora, a única coisa que entendo é que -2 é equivalente a export TERM=screen-256color ( source ) .

Guake comporta-se de forma análoga ao Terminal e ambos respondem xterm à questão echo $TERM .

Pergunta

Basicamente, alguém entende por que tudo funciona mesmo que não devesse?

  • Eu sou sádico por reclamar porque as coisas funcionam? Talvez.
  • Existe uma razão melhor? Claro: gostaria de corrigir a aparência de outras caixas do Ubuntu no meu escritório e gostaria de entender por que as coisas funcionam ou não funcionam.

Experimentos adicionais

Executando esse script (ligeiramente modificado) no meu xterm fornece o seguinte resultado: 256 cores, mas apenas 16 são exibidos corretamente.

Depois,alterandooperfildoterminal,essas16corestambémmudam.

Mais testes estão seguindo.

Da esquerda para a direita, de cima para baixo, temos o tema de cores Solarizado , dircolor ansi-dark e 256dark , depois o esquema de cores padrão ( Tango ) , dircolor ansi-dark e 256dark .

Observação : em teoria, o esquema de cores dircolor ansi-dark on Solarizado deve corresponder de perto a dircolor 256dark . Isso não está claramente acontecendo para os arquivos listados específicos. Em vez disso, isso acontece quando no diretório de trabalho existem pastas , arquivos de texto e links simbólicos . Conclusão : pouca atenção foi dada ao codificar as cores 256dark .

Conclusões preliminares

xterm suporta 256 cores, apesar do que tput colors diz. Os programas podem se referir à paleta ansi (personalizável pelo usuário) ou definir suas cores, escolhendo de um total de 256 cores.

    
por Atcold 09.03.2014 / 06:42

3 respostas

30

Existem algumas informações sobre o suporte a 256 cores na FAQ do tmux .

Detectar o número de cores que o terminal suporta infelizmente não é simples, por razões históricas. Consulte Verificando quantas cores meu emulador de terminal oferece suporte para uma explicação. Isso significa que

  • O tmux não pode determinar com segurança se o terminal suporta mais de 8 cores;
  • O tmux não pode se comunicar de forma confiável com o aplicativo que suporta mais de 8 cores.

Quando você está no tmux, o terminal com o qual você está interagindo é o tmux. Não suporta todas as sequências de controle do xterm. Em particular, ele não suporta a sequência de controle OSC 4 ; … para consultar ou definir valores de cores. Você precisa usá-lo enquanto estiver executando diretamente no xterm, fora do tmux.

Se você executar tmux -2 , o tmux iniciará com suporte a 256 cores, mesmo que não pense que seu terminal suporta 256 cores (o que é bastante comum).

Por padrão, o tmux se anuncia como screen sem suporte a 256 cores. Você pode alterar o valor de TERM em .tmux.conf para indicar suporte a 256 cores:

set -g default-terminal "screen-256color"

Você pode usar TERM=xterm-256color ou TERM=screen-256color no Ubuntu. Esses valores só causarão problemas se você efetuar login em uma máquina remota que não tenha uma entrada termcap / terminfo para esses nomes. Você pode copiar as entradas para o seu diretório pessoal na máquina remota; isso funciona com a maioria das implementações terminográficas modernas.

# From the Ubuntu machine to a machine that doesn't have *-256color terminfo entries
ssh somewhere.example.com mkdir -p .terminfo/s .terminfo/x
scp -p /lib/terminfo/s/screen-256color somewhere.example.com:.terminfo/s/
scp -p /lib/terminfo/x/xterm-256color somewhere.example.com:.terminfo/x/
    
por 10.03.2014 / 00:35
17

Estou impressionado com o quão bem formatado e detalhado as respostas (e a pergunta!) são. Embora eles forneçam informações e soluções valiosas sobre as ferramentas que você mencionou, eles fornecem muito pouca visão sobre o que diabos está acontecendo, e, o mais importante, porque as coisas estão (de alguma forma). ) trabalhando para algumas ferramentas quando elas supostamente não deveriam.

Então, aqui estão alguns insights sobre suas questões fundamentais:

  • O que um terminal suporta e o que reporta são coisas diferentes. O terminal Gnome, por exemplo, tem capacidade de exibir 256 cores, mas anuncia o próprio ao ambiente (via $TERM variable) como xterm emulator (8 color).

  • Ferramentas como tput seguem o que TERM está definido como: tput colors pode imprimir 8, enquanto env TERM=xterm-256color tput colors imprimirá 256, independentemente de seu terminal realmente suportar esses recursos .

  • vim também segue TERM por padrão, mas como você disse para usar 256 cores (via flag ou set t_Co=256 ), ele usa 256 cores. E funciona porque o seu terminal realmente suporta isso.

  • tmux , assim como o Gnome Terminal, também por padrão se reporta como um terminal de 8 cores. Mas, ao contrário do Gnome Terminal, ele só habilita a capacidade de 256 cores se você usar o -2 flag, que também o torna reportar como um emulador compatível com xterm-256color .

  • xterm , como em o software emulador de terminal para o X11 , suporta 256 cores, com certeza. Mas xterm como em TERM=xterm é um "padrão" de 8 cores. Isso significa os recursos do original xterm . Quando foi atualizado para suportar 256 cores, há muito tempo, ele criou o termo xterm-256color para isso.

Então tudo se resume a:

  • Quais recursos seu terminal realmente suporta (e está habilitado para isso)

  • Como relata esses recursos ao ambiente por meio de TERM

  • Como as ferramentas interpretam TERM e se ajustam de acordo.

  • Como você pode deduzir do que foi dito acima, evite martelar export TERM=xterm-256color em seu ~/.bashrc e tais scripts . Como esses arquivos são executados independentemente do terminal que você está realmente usando, ele fará com que todos os seus terminais, incluindo conexões remotas do Windows com Putty, terminal de console do Linux, etc., se comuniquem como compatíveis com o xterm-256color. . O que pode ser verdade para alguns, mas certamente não para todos. Por exemplo, getty , o console do Linux que você acessa com CTRL+ALT+1..6 , não.

  • Os terminais devem se reportar como o "padrão" com o qual são mais compatíveis. Se você souber que eles podem manipular 256 cores, configure-os para anunciar como tal.

Por último, mas não menos importante, uma leitura incrível sobre TERM e 256 cores é:

link

link

    
por 29.01.2015 / 10:37
5

Fornecerei uma resposta complementar que aborda apenas as suas experiências adicionais, na medida em que se relacionem com as cores do diretório solarizado .

Configuração

Temos a mesma saída de cores do script de teste. A única diferença é que usei lxterminal em Openbox com slim , xcompmgr e sem DM. Portanto, não posso definir facilmente uma paleta personalizada como você fez, já que o emulador de terminal não oferece essas configurações em uma GUI e não há nenhuma para ele (aqueles que existem apenas para alguns emuladores de terminal). Então eu uso apenas alguns translucência, terminais não decorados e aquele azul como cor de primeiro plano com um fundo azul do Gentoo . Como não posso usar as versões ansi dos arquivos de cores, concentrei-me exclusivamente em obter resultados com dircolors.256dark , ou seja, a versão simples "degradada".

Eu usei a seguinte configuração relevante e a fonte média inconsolata :

echo $TERM
xterm

.bashrc:
eval 'dircolors /path/to/dircolors.256dark'

.vimrc:
set t_Co=256
let g:solarized_termcolors=256
syntax enable
set background=dark
colorscheme solarized

.tmux.conf:
nothing at all related to colors!
start tmux with "tmux -2"

Dircolors

A imagem abaixo mostra o que acontece dentro e fora de tmux com essas configurações. O primeiro terço à esquerda mostra janelas lxterminal não empilhadas empilhadas verticalmente (3). À direita você tem um assembly tmux mostrando os mesmos programas idênticos (3) Eu também incluí um solarized xterm 1 mostrando nano usando o arquivo .Xresources incluído no pacote completo (e amostragem com xrdb -load ~/.Xresources ):

cliquecomobotãodireitodomouse/visualizeaimagemparainspecionarnaresoluçãomáxima

Oprimeiroterminalnocantosuperioresquerdomostraascoresdodiretóriopadrão.Logoabaixoestáaversãodegradadasolarizada.Comexceçãodorosasobrefundoazulpara.carquivosqueeuadicionei,éidênticoaoqueéesperadodisso(vejaaimagemabaixoparareferência).Comparadocomospadrões,elesebaseiaaindamaisnosatributosestendidos,ouseja,emnegrito/claro/reverso,etc.,eascoressãodiferentes,obviamente.Aatribuiçãodecorespadrãoparaosarquivos.txtemmuitasdistribuiçõeséverde,masdevesercinzaquandosolarizado.Umarquivoansiquerenderizaumarquivo.txtcomoverdenãoérenderizadocorretamenteounãoérenderizado.Osresultadosdoladodireitoquevocêmostrousãooscorretos(256dark)emrelaçãoàseguintereferência:

mapa de referência solar "degradado"

Observações

Com a configuração que eu usei, os resultados aparecem idênticos dentro e fora do tmux (eu reverta os comentários (#) no vi mas o plugin se comporta como deveria e o multiplexador não tem impacto sobre isso ). As fontes desempenham um grande papel na definição de recursos do solarized , e uma boa fonte é necessária para maximizar a experiência. As cores do diretório solarized usando o arquivo 256dark correspondem à referência e não exigem configuração específica do emulador de terminal.

Conclusão

Na verdade, a renderização ansi das cores do diretório é apenas completamente diferente do degradado solarizado (256dark). Tanto que, sob ansi .txt , os arquivos são verdes. Não se pode usar um para validar a renderização do outro. Ambas as soluções precisam de configurações diferentes e produzem resultados totalmente diferentes.

    
por 15.03.2014 / 07:35