Por que as cores do Vim parecem diferentes dentro e fora do tmux?

29

Meio Ambiente:

  • Fedora 25 (4.9.12-200.fc25.x86_64)
  • Terminal GNOME 3.22.1 Usando o VTE versão 0.46.1 + GNUTLS
  • VIM - Vi IMproved 8.0 (12 de setembro de 2016, compilado em 22 de fevereiro de 2017 16:26:11)
  • tmux 2.2

Recentemente, comecei a usar o tmux e observei que as cores no Vim mudam dependendo de eu estar executando dentro ou fora do tmux. Abaixo estão as capturas de tela do Vim fora (esquerda) e dentro (direita) do tmux enquanto visualiza um diff do Git:

insira a descrição da imagem aqui

Minha TERMvariável é

  • Fora do tmux: xterm-256color
  • Dentro do tmux: screen-256color

O Vim relata esses tipos de terminal conforme o esperado (via :set term?):

  • Fora do tmux: term=xterm-256color
  • Dentro do tmux: term=screen-256color

O Vim também relata que as duas instâncias estão em execução no modo de 256 cores (via :set t_Co?):

  • Fora do tmux: t_Co=256
  • Dentro do tmux: t_Co=256

Existem muitas perguntas semelhantes por aí sobre o funcionamento do Vim no modo de 256 cores no tmux (a melhor resposta que encontrei aqui) ), mas não acho que esse seja o meu problema, dadas as informações acima.

Posso duplicar o problema fora do tmux se executar o Vim com o tipo de terminal definido como screen-256color:

$ TERM=screen-256color vim

Então, isso me faz acreditar que há simplesmente alguma diferença entre os recursos terminal xterm-256colore screen-256colorque causa a diferença de cor. O que leva à pergunta colocada no título: o que especificamente nos recursos do terminal faz com que as cores do Vim sejam diferentes? Eu vejo as diferenças entre executar :set termcapdentro e fora do tmux, mas estou curioso para saber quais variáveis ​​realmente causam a diferença de comportamento.

Independente da pergunta anterior, é possível que as cores do Vim sejam consistentes ao executar dentro ou fora do tmux? Algumas coisas que eu tentei incluem:

  • Definir explicitamente o terminal padrão que o tmux usa ~/.tmux.confpara vários valores (alguns contra o conselho da FAQ do tmux ):
    defina -g default-terminal "screen-256color"
    defina -g default-terminal "xterm-256color"
    defina -g default-terminal "screen.xterm-256color"
    configure -g default-terminal "tmux-256color"
  • Iniciando o tmux usando tmux -2.

Em todos os casos, o Vim continuou exibindo cores diferentes dentro do tmux.

Rusty Shackleford
fonte
Você poderia iniciar script, iniciar vim, sair vime, em seguida, sair scriptdo shell e anexar o typescriptarquivo resultante ? Em seguida, repita os mesmos passos com TERM=screen-256color vim.
Egmont
@egmont Aqui você vai: typescript-xterm-256color e typescript-screen-256color .
Rusty Shackleford
1
Consigo ver sequências de escape de 256 cores na xterm-256colorversão (pesquise "38; 5;" no arquivo), mas não consigo screen-256color. Por exemplo, onde há um \e[38;5;81mem xterm-256color(cor # 81 da paleta de 256 cores, uma sombra azul média), screen-256colorcontém \e[34mem vez (o padrão azul da paleta de 8 cores). Portanto, a principal questão é por que o vim não usa a paleta de 256 cores no caso de TERM=screen-256color.
Egmont
Outra coisa interessante é que a xterm-256colorversão parece imprimir a tela duas vezes, primeiro com as cores herdadas e depois com a paleta de 256 cores. Pesquise, por exemplo, "F1" no arquivo, você encontrará duas correspondências xterm-256color, a primeira com \e[34mcor e a segunda com \e[38;5;81m. Eu não sei o que está acontecendo aqui.
Egmont
Adicionando set -g default-terminal "screen.xterm-256color"em ~/.tmux.confe recarregar a configuração em tmux (<Cs>: fonte arquivo ~ / .tmux.conf) trabalhou para mim (edição destaque). thx
dtrckd

Respostas:

17

Eu tive o problema semelhante antes. Os comentários em azul no Vim eram difíceis de ler. Em .tmux.confeu defino isso:

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

E em .vimrc:

set background=dark

Agora parece o seguinte e funciona tanto no Gnome Terminal quanto no Cygwin: insira a descrição da imagem aqui

Vitalii Plagov
fonte
3
Isso resolveu para mim. Por alguma razão, dentro do tmux, o vim não estava detectando um fundo escuro. A configuração explícita bg=darkno meu vimrc o corrigiu.
Adam Keenan
Estranho - meu $TERMinterior e o exterior tmuxeram "xterm-256color"e, explicitamente, definir o background também o fez por mim. Obrigado!
Nronnei 11/1018
Trabalhou para mim também. Eu pensei que estava o problema, sttermporque em xfce4-terminaltudo parecia confortável (comentários aparecendo em cyanvez de blueque é muito difícil de ler com fundo escuro). após essa alteração, tudo funciona bem. Mas lembre-se de adicionar unlet! skip_defaults_vim source $VIMRUNTIME/defaults.vimao arquivo vimrc para usar o destaque da sintaxe, etc ...
Abinash Dash
2

Graças à análise da @ egmont de quais cores o Vim exibia quando TERM=screen-256color, fui inspirado a observar o esquema de cores que o Vim está usando nos dois cenários.

O Vim relata que está usando o defaultesquema de cores nos dois casos. Eu achei isso estranho, porque o defaultesquema de cores no Fedora 25 ( /usr/share/vim/vim80/colors/default.vim) não parece corresponder às cores que realmente vejo quando TERM=xterm-256color. Se eu definir explicitamente o esquema de cores usando :colorscheme defaultwhen TERM=xterm-256color, a aparência do Vim será alterada para quando TERM=screen-256color. Para recuperar as cores como eram quando eu iniciei o Vim, tive que usar o ronesquema de cores. Progresso!

Encontrei uma resposta do Ask Ubuntu que sugere que, quando o Vim relata que está usando o defaultesquema de cores, isso não significa necessariamente, default.vimmas sim um esquema de cores específico do tema. Como a resposta aponta, um tema sombrio (que estou usando) corresponde ao ronesquema de cores, exatamente como descobri acima. (Embora este post seja sobre o Ubuntu, estou assumindo que o OP estava usando o GNOME.)

Eu também encontrei outra pergunta que parece descrever o mesmo problema que estou tendo. Eu o encontrei enquanto pesquisava antes de postar esta pergunta, mas, por algum motivo, o esquema de cores não me pareceu relevante.

Acabei fazendo o que @LapshinDmitry fez em sua resposta e defini explicitamente colorscheme ronem meu ~/.vimrcarquivo. Agora, se eu inicio o Vim dentro ou fora do tmux, as cores parecem as mesmas. A única desvantagem é que se eu mudar meu tema da área de trabalho de um sabor escuro para um sabor leve, o Vim não mudará automaticamente para o esquema de cores do tema claro "padrão", que aparentemente é peachpuff. Eu posso viver com isso, pois é improvável que eu mude de tema.

Não vou aceitar esta resposta porque considero definir explicitamente o esquema de cores em ~/.vimrcuma solução alternativa, e não na solução. Se alguém puder explicar por que o Vim carrega um esquema de cores "padrão" diferente, dependendo do valor de TERM, ficarei feliz em aceitar essa resposta, pois estou mais interessado em entender a causa raiz. Eu suspeito que tenha algo a ver com a forma como o Vim interpreta os recursos do terminal entre os dois arquivos terminfo.

Rusty Shackleford
fonte
Também estou curioso por que vimse comporta dessa maneira. Afinal, o bcerecurso não deve ter nada a ver com o número disponível de cores.
Egmont
@egmont Interpretei a resposta de @ ThomasDickey como: 1) O Vim verifica a bcecapacidade do terminal, 2) se presente, selecione o esquema de cores "A", 3) caso contrário, selecione o esquema de cores "B". Acredito que a profundidade da cor seja a mesma nos dois casos (ou seja, 256 cores, como t_Comostra). É apenas que o esquema de cores "B" no meu sistema usa apenas uma paleta de 8 cores, mesmo que 256 cores sejam possíveis ( acho que explica o que você observou em sua análise datilografada; me corrija se estiver errado). Lembre-se, depois de executar :colorscheme ron, vejo sequências de escape de 256 cores na mesma sessão do Vim.
Rusty Shackleford #
Obrigado pela explicação - ainda não consigo ver nenhuma justificativa por trás disso. Deixa pra lá. vimtem decisões de design realmente estranhas.
Egmont
0

Minha variável TERM é Fora do tmux: xterm-256color Dentro do tmux: screen-256color

Isso está correto e está funcionando para mim. Experimente com um terminal diferente (eu uso o urxvt) para ver se o Terminal do Gnome é o problema. O que outras pessoas estão dizendo

Verifique também COLORTERM(o meu está definido como rxvt) e unset TERMCAP.

Laktak
fonte
Obrigado pelas sugestões. Fiz o mesmo teste com o urxvt (externoTERM é rxvt-unicode-256color) usando ~/.Xdefaultscores apropriadas e, infelizmente, ainda observamos diferentes cores dentro e fora do tmux. Para o cenário do gnome-terminal, COLORTERMé truecolore TERMCAPestá vazio tanto dentro quanto fora do tmux. Para o cenário urxvt, COLORTERMestá rxvt-xpmfora e truecolordentro do tmux, enquanto TERMCAPestá vazio tanto dentro quanto fora do tmux.
Rusty Shackleford
@RustyShackleford isso é apenas para o Vim? Você está usando 'termguicolors'? Dê uma olhada :help xterm-true-colorou tente com uma configuração mais padrão do Vim.
Laktak 03/03/19
Eu só notei o problema no Vim até agora (como eu disse, só recentemente comecei a usar o tmux). Por exemplo, o prompt do meu terminal e a saída da CLI do Git parecem ter as mesmas cores dentro e fora do tmux. Não defino termguicolorsnos meus relatórios .vimrce nos dois casos. Vou dar uma olhada no tópico de ajuda que você referenciou; obrigado! :set termguicolors?notermguicolors
Rusty Shackleford
0

Para minha própria referência, mais tarde, quando eu, sem dúvida, pesquisar no Google essa configuração da minha próxima máquina.

  • Vim8 / Neovim
  • Windows 10
  • Git bash
  • Tmux 2.7

Use estas instruções para obter os binários e DLLs necessários no PATH do Git bash:

https://blog.pjsen.eu/?p=440

Use estes comandos para configurar:

echo 'set -g default-terminal "screen.xterm-256color"' > ~/.tmux.conf
tmux -2u
Josh Peak
fonte