Suporte a tmux, TERM e 256 cores

48

Introdução

Minha pergunta surge da necessidade de entender por que agora tenho (após várias tentativas) o Terminal e o tmux suportando 256 cores e tput colorsme dizendo que existem apenas 8 delas.


fundo

Vamos começar do começo.

Estou usando uma caixa do Ubuntu , Guake , tmux , Vim e adoro o tema Solarized . Eles estavam com uma aparência horrível, então decidi ativar o suporte para 256 cores e brincar um pouco.

Vamos ver o que acontece no meu terminal . tput colorsdiz que existem 8 cores. Pessoalmente, defino-os como roxo, à esquerda e, claro, à direita, temos 2 tons diferentes de azul. $TERMdiz xterm. (Para ter o colorido lsI eval este no meu .bashrc.)

insira a descrição da imagem aqui

O Vim também parece bem, apesar do fato de eu chamá-lo com a 256bandeira em um ambiente em que 256 cores não são suportadas.

set t_Co=256
let g:solarized_termcolors=256
colorscheme solarized

O único cara que reclama do espaço reduzido de cores é o tmux . A chamada tmuxfornece os resultados esperados "errados".

insira a descrição da imagem aqui

Mas chamar tmuxcom a -2bandeira faz tudo funcionar bem, magicamente .

insira a descrição da imagem aqui

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

Guake se comporta de maneira análoga ao Terminal e os dois respondem xtermà pergunta echo $TERM.


Pergunta, questão

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

  • Estou sádico por reclamar por que 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.

Experiências adicionais

A execução desse script (ligeiramente modificado) no meu xtermfornece o seguinte resultado: 256 cores, mas apenas 16 são exibidas corretamente.

insira a descrição da imagem aqui

Então, mudando o perfil do terminal, também essas 16 cores mudam.

insira a descrição da imagem aqui

Mais testes estão a seguir.

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

insira a descrição da imagem aqui

Observação : em teoria, o dircolor ansi-darkon Solarizado esquema de cores deve ter jogo de perto a dircolor 256dark. Isso não está acontecendo claramente 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 : não foi dada muita atenção ao codificar as 256darkcores.


Conclusões preliminares

xtermsuporta 256 cores, apesar do que tput colorsdiz. Os programas podem se referir à ansipaleta (personalizável pelo usuário) ou definir suas cores, escolhendo um total de 256 cores.

Atcold
fonte
1
Leia esta resposta e os comentários abaixo. Responde a sua pergunta? Veja também este script para obter o número real de cores suportado.
terdon
Hum ... ainda estou um pouco confuso ... Mas acho que pelo menos estou entendendo que tput colorsé um teste não confiável. Você poderia verificar minhas conclusões preliminares ?
Atcold
2
Minha leitura da resposta de Gilleś é que tput colorssó é possível retornar um valor e, nos terminais que suportam qualquer uma das 2,8,16,88 ou 256 cores, apenas o primeiro valor (8 no seu caso) é retornado. Para obter o valor verdadeiro, use o script do meu último comentário. O que isso retorna?
terdon
Verifique meus experimentos adicionais acima :)
Atcold
Ah, desculpe, meu mal.
terdon

Respostas:

33

Há algumas informações sobre o suporte de 256 cores nas perguntas frequentes do tmux .

Infelizmente, a detecção do número de cores que o terminal suporta não é direta, por razões históricas. Consulte Verificando quantas cores meu emulador de terminal suporta para obter 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 maneira 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. Ele não suporta todas as seqüências de controle do xterm. Em particular, ele não suporta a OSC 4 ; …sequência de controle 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 começará com suporte para 256 cores, mesmo que não pense que seu terminal suporta 256 cores (o que é bastante comum).

Por padrão, o tmux se anuncia screensem suporte a 256 cores. Você pode alterar o valor de TERMin .tmux.confpara indicar suporte para 256 cores:

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

Você pode usar TERM=xterm-256colorou TERM=screen-256colorno 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 diretório inicial na máquina remota; isso funciona com a maioria das implementações modernas de terminfo.

# 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/
Gilles 'SO- parar de ser mau'
fonte
Agradeço a explicação, mas não tenho certeza de que ela atenda à minha pergunta. Bem, concordo que minha pergunta foi bastante ampla, mas não estava focada especificamente no tmux . Na verdade, tmux era o único cara que estava se comportando de acordo com as expectativas. O que foi muito mais misterioso foi como xtermfoi capaz de me mostrar 256 cores, embora tput colorsestivesse dizendo 8. Acho que a resposta a essa pergunta específica foi abordada por @terdon em seus comentários à pergunta em si.
Atcold
@Atcold É uma pergunta longa, mas, tanto quanto posso dizer, respondi. As partes não relacionadas ao tmux são cobertas pela resposta à qual eu e o terdon vinculamos (e que escrevi). Sua pergunta seria uma duplicata daquela, se não fosse pelo aspecto do tmux. O que mais você esperava de uma resposta?
Gilles 'SO- stop being evil
1
@ Gilles , eu não queria parecer maldoso . Eu estava tentando credenciar @terdon a coisa "resposta aceita", mesmo que ele se refira à sua resposta em outra pergunta. Apesar disso, o set -g default_terminal "screen-256color"comando não é suficiente para ativar as 256 cores no tmux . Você precisa alias tmux='export TERM=screen-256color; /usr/bin/tmux'( referência ).
Atcold 11/03/14
@Atcold Não, o alias não é necessário (eu testei). Além disso, esse apelido não faria sentido: ele finge que o tmux está sendo executado dentro da tela ou do tmux. No entanto, você precisa executar tmux -2conforme meu parágrafo anterior, se o tmux não achar que seu terminal atual suporta 256 cores, isso alias tmux='tmux -2'faria sentido.
Gilles 'SO- stop be evil'
2
@Atcold Essa resposta da U&L tem TERM=xterm-256color tmux, o que é sensato, diferente TERM=screen-256color tmux. tmux -2é superior porque funciona mesmo que screen-256colornão esteja no banco de dados terminfo local.
Gilles 'SO- stop be evil'
20

Estou impressionado com o quão ricamente formatadas e detalhadas são as respostas (e a pergunta!). Embora eles forneçam informações e soluções valiosas sobre as ferramentas mencionadas, eles fornecem muito pouco conhecimento sobre o que está acontecendo e, o mais importante, por que as coisas estão (um pouco) funcionando para algumas ferramentas quando, supostamente, não deveriam.

Então, aqui estão algumas idéias sobre suas perguntas fundamentais:

  • O que um terminal suporta e o que ele relata são coisas diferentes. O terminal Gnome, por exemplo, é capaz de exibir 256 cores, mas se anuncia ao ambiente (via $TERMvariável) como um xtermemulador (8 cores).

  • Ferramentas como tputseguem o que TERMestiver definido como: tput colorspodem imprimir 8, enquanto env TERM=xterm-256color tput colorsimprimirão 256, independentemente se o seu terminal realmente suportar esses recursos.

  • vimtambém segue TERMpor padrão, mas como você disse para usar 256 cores (através da bandeira ou do set t_Co=256), ele usará 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, diferentemente do Gnome Terminal, ele só habilita a capacidade de 256 cores se você usar o -2sinalizador, o que também o faz se reportar como um xterm-256coloremulador compatível.

  • xterm, como no software de emulador de terminal para o X11 , suporta 256 cores, com certeza. Mas xtermcomo TERM=xtermé um "padrão" de 8 cores. Significa os recursos do original xterm . Quando foi atualizado para suportar 256 cores, há muito tempo, cunhou o xterm-256colortermo para isso.

Então tudo se resume a:

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

  • Como ele relata esses recursos ao ambiente via TERM

  • Como as ferramentas interpretam TERMe se ajustam de acordo.

  • Como você pode inferir do exposto, evite martelar export TERM=xterm-256colorem seus ~/.bashrcscripts . Como esses arquivos são executados independentemente do terminal que você está realmente usando, todos os seus terminais, incluindo conexões remotas do Windows com Putty, terminal de console Linux etc., se reportam como compatíveis com xterm-256color. O que pode ser verdade para alguns, mas certamente não para todos. Por exemplo, gettyo console linux com o qual você acessa CTRL+ALT+1..6não.

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

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

http://blog.sanctum.geek.nz/term-strings/

http://blog.sanctum.geek.nz/256-colour-terminals/

MestreLion
fonte
Um cenário de exemplo ou dois seriam boas adições a esta resposta.
Elijah Lynn
5

Fornecerei uma resposta complementar que aborda apenas suas experiências adicionais, na medida em que elas se relacionam às cores do diretório solarizado .

Configuração

Temos a mesma saída de cor do script de teste. A única diferença é que eu usei lxterminalno Openbox com slim , xcompmgr e sem DM. Portanto, não posso definir facilmente uma paleta personalizada, como você fez, pois esse emulador de terminal não oferece essas configurações em uma GUI e não há um tema específico para ela (elas existem apenas para alguns emuladores de terminal). Então, eu apenas uso translúcidos, terminais não decorados e essa cor azul como 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.256darka versão simples "degradada".

Usei a seguinte configuração relevante e a fonte inconsolata medium:

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 do tmux com essas configurações. O primeiro terço à esquerda mostra janelas finais sem decoração empilhadas verticalmente (3). À direita, você tem um assembly tmux mostrando os mesmos programas idênticos (3) Eu também incluí um 1 solarizado mostrando o nano usando o arquivo .Xresources incluído no pacote completo (e amostrando-o com ):xtermxrdb -load ~/.Xresources

insira a descrição da imagem aqui clique com o botão direito do mouse / veja a imagem para inspecionar em resolução máxima

O primeiro terminal no canto superior esquerdo mostra as cores do diretório padrão. Logo abaixo está a versão solarizada degradada . Exceto pelo fundo rosa em azul para os .carquivos que eu adicionei, é idêntico ao esperado com isso (veja a imagem abaixo para referência). Comparado aos padrões, ele se baseia nos atributos estendidos, como negrito / claro / reverso etc. e as cores são diferentes, obviamente. A atribuição de cores padrão para .txtarquivos em várias distribuições é verde, mas deve ser cinza quando solarizada . Um arquivo ansi que processa um arquivo .txt como verde não está processando corretamente ou não está processando. Os resultados do lado direito que você mostrou são os corretos (256dark) em relação à seguinte referência:

insira a descrição da imagem aqui mapa de referência dircolors "degradado" solarizado

Observações

Com a configuração que usei, os resultados parecem idênticos dentro e fora do tmux ( invertei os comentários (#) no vi, mas, caso contrário, o plug-in se comporta como deveria e o multiplexador não tem impacto nisso). As fontes desempenham um papel importante na definição de recursos solarizados e é necessária uma boa fonte para maximizar a experiência. As cores do diretório solarizado usando o arquivo 256dark correspondem à referência e não requerem configuração específica do emulador de terminal.


Conclusão

Na verdade, a renderização ansi das cores do diretório é completamente completamente diferente da solarizada degradada (256dark). Tanto é assim que nos arquivos ansi .txt são verdes. Um não pode ser usado para validar a renderização do outro. Ambas as soluções precisam de configuração diferente e produzem resultados totalmente diferentes.


fonte
"Eu não entendo sua conclusão de que não foi dada muita atenção à codificação 256dark, onde na verdade é o único arquivo colorido que produz uma listagem de diretório solarizada?" Minha confusão surge do fato de eu estar considerando a ansi-darksaída correta (já que está usando a versão não degradada). Então, se você tomar como referência a saída do 256dark, terá a mentalidade invertida.
Atcold
"Com a configuração que eu usei, os resultados parecem idênticos dentro e fora do tmux" Claro, se você estiver usando 256 cores, é claro, elas serão renderizadas da mesma maneira onde quer que você tenha 256 cores. "Não está claro o que a solução ansi forneceria ainda neste contexto ..." O resultado seria ter os verdadeiros Solarizados (em vez de uma aproximação).
Atcold
Compreendo. Eu realmente não pesquisei a parte ansi, então não pude entender de onde você estava vindo. De qualquer forma, achei o seu Q bastante favorável, obrigado. Talvez eu use mais o vi agora que acho muito engraçado. Quanto aos resultados da ansi, na verdade agora eu vi como fica ... eles apenas mostram isso para cores dir aqui . Por que o h. eles têm codificação diferente sob isso ... quero dizer, vejo .txt verde ... como cinza está perto de verde? Eu não entendo o projeto deles seriamente.
Sim, entrei em contato com o autor pessoalmente e a resposta é que "era sua personalização pessoal, já que ele gostava desse jeito". Estou sem palavras ... Ainda bem que meu Q ajudou alguém :)
Atcold