Problemas ao usar o esquema de cores no NeoVim

16

Não tenho um entendimento completo de como meu esquema de cores está interagindo com a termconfiguração no vim e isso está impedindo minha capacidade de exibi-lo corretamente no neovim.

No meu arquivo .vimrc, o comportamento correto do esquema de cores em questão requer a configuração

set term=xterm
set t_Co=256

A omissão de uma dessas configurações resulta na exibição incorreta do esquema de cores:

correto Exibição em cores correta incorreto Tela colorida incorreta diferente incorreto Visor a cores incorreto diferente

O esquema é assim:

set background=dark
hi clear
if exists("syntax_on")
    syntax reset
endif
let g:colors_name="impact3"

if exists("g:impact_transbg")
    hi Normal       ctermfg=255 ctermbg=none
    hi NonText      ctermfg=DarkGray  ctermbg=none

    hi Statement    ctermfg=Blue      ctermbg=none
    hi Comment      ctermfg=DarkGray  ctermbg=none cterm=bold term=bold
    hi Constant     ctermfg=173  ctermbg=none
    hi Identifier   ctermfg=Cyan      ctermbg=none
    hi Type         ctermfg=DarkGreen ctermbg=none
    hi Folded       ctermfg=0 ctermbg=235 cterm=underline term=none
    hi Special      ctermfg=Blue      ctermbg=none
    hi PreProc      ctermfg=LightGray ctermbg=none cterm=bold term=bold
    hi Scrollbar    ctermfg=Blue      ctermbg=none
    hi Cursor       ctermfg=white     ctermbg=none
    hi ErrorMsg     ctermfg=Red       ctermbg=none cterm=bold term=bold
    hi WarningMsg   ctermfg=Yellow    ctermbg=none
    hi VertSplit    ctermfg=0     ctermbg=0
    hi Directory    ctermfg=Cyan      ctermbg=DarkBlue
    hi Visual       ctermfg=White     ctermbg=Gray cterm=underline term=none
    hi Title        ctermfg=255     ctermbg=Blue
    hi String       ctermfg=Blue   ctermbg=none

    hi StatusLine   term=bold cterm=bold,underline ctermfg=White ctermbg=Black
    hi StatusLineNC term=bold cterm=bold,underline ctermfg=Gray  ctermbg=Black
    hi LineNr       term=bold cterm=bold ctermfg=2 ctermbg=None
    hi Search       ctermfg=Black ctermbg=2
    hi TabLine      ctermfg=0 ctermbg=DarkGray
    hi TabLineFill  ctermfg=DarkGray ctermbg=DarkGray
else
    hi Normal       ctermfg=White ctermbg=Black
    hi NonText      ctermfg=DarkGray  ctermbg=Black

    hi Statement    ctermfg=Blue      ctermbg=Black
    hi Comment      ctermfg=DarkGray  ctermbg=Black cterm=bold term=bold
    hi Constant     ctermfg=DarkCyan  ctermbg=Black
    hi Identifier   ctermfg=Cyan      ctermbg=Black
    hi Type         ctermfg=DarkGreen ctermbg=Black
    hi Folded       ctermfg=DarkGreen ctermbg=Black cterm=underline term=none
    hi Special      ctermfg=Blue      ctermbg=Black
    hi PreProc      ctermfg=LightGray ctermbg=Black cterm=bold term=bold
    hi Scrollbar    ctermfg=Blue      ctermbg=Black
    hi Cursor       ctermfg=white     ctermbg=Black
    hi ErrorMsg     ctermfg=Red       ctermbg=Black cterm=bold term=bold
    hi WarningMsg   ctermfg=Yellow    ctermbg=Black
    hi VertSplit    ctermfg=White     ctermbg=Black
    hi Directory    ctermfg=Cyan      ctermbg=DarkBlue
    hi Visual       ctermfg=White     ctermbg=DarkGray cterm=underline term=none
    hi Title        ctermfg=White     ctermbg=DarkBlue

    hi StatusLine   term=bold cterm=bold,underline ctermfg=White ctermbg=Black
    hi StatusLineNC term=bold cterm=bold,underline ctermfg=Gray  ctermbg=Black
    hi LineNr       term=bold cterm=bold ctermfg=White ctermbg=Black
endif

No neovim, termnão pode ser definido. Tentei invocar o neovim com um $ TERM manualmente definido da seguinte maneira:

TERM=xterm nvim

Isso produziu a exibição correta das cores no vim regular (ou seja, equivalente à definição do termo em .vimrc), mas no neovim se parece com isso:

insira a descrição da imagem aqui

Por que a combinação set term=xterme o set t_Co=256necessário para produzir a exibição correta desse esquema de cores no vim e por que a combinação equivalente de configurações produz um resultado diferente no neovim?

Editar:

O padrão é que$TERM=xterm256-color , por algum motivo, deve ser substituído xtermno vim regular para que a cor seja exibida corretamente. Com a variável de ambiente no padrão 256, o neovim fica assim:

insira a descrição da imagem aqui

Isso é idêntico ao vim regular xterm256-color, mas não como pretendido. Meu objetivo é entender por que o xterm hack é necessário / funcionando no vim e por que não parece o mesmo no neovim.

Observe que muitas das cores aparecem corretamente com a configuração da variável env do termo acima, com exceções notáveis ​​como números de linha e plano de fundo. Suspeito que a maneira como as cores sejam especificadas nesse esquema de cores específico possa estar envolvida.

Gall
fonte
11
Seu $ TERM já está definido para o que geralmente é considerado 'correto' em sistemas modernos - 256 cores ativadas. Portanto, a opção t_Co, que normalmente é compatível com terminais mais antigos, não deve ser necessária. E se você comentar as duas linhas de configuração?
David Lord
@ David Comentar as duas linhas de configuração é igual a comentar set term=xterm.
Gall
Você poderia incluir uma captura de tela da configuração de cores do iTerm que você usa quando o tema é renderizado corretamente, bem como a saída da execução desse script ?
Eric Pruitt

Respostas:

11

Problema principal

O principal problema que você está enfrentando é causado pela ordem dos comandos no seu .vimrc.

Você define a g:impact_transbgvariável depois de carregar o esquema de cores e, portanto, a variável não existe quando marcada pela ifinstrução do esquema de cores , e a segunda versão do esquema de cores (no elsebloco) é usada.

Para corrigir, basta mover a linha que define a variável acima da linha em que você carrega o esquema de cores:

let g:impact_transbg=1
colorscheme impact3

Você pode (e deve!) Remover as linhas desnecessárias do seu .vimrc:

set term=xterm
set background=dark
set t_Co=256

Outros problemas

Também posso esclarecer alguns outros equívocos / confusões que você possa ter sobre como tudo isso funciona:

Explicando o comportamento de 'term'&'t_Co'

Seu $ TERM está definido como xterm256-color. O Vim lê isso e consulta terminfo (ou termcap) para descobrir quantas cores o terminal suporta e depois define de 't_Co'acordo. Presumindo que seu $ TERM esteja correto (o seu é) e seu banco de dados terminfo contém as informações corretas para esse terminal (o seu contém), você nunca precisará redefinir manualmente 't_Co'.

No entanto, você está configurando manualmente o Vim 'term'para xterm. Seu terminfo informa ao Vim que este terminal suporta apenas 8 cores; portanto, adicionar isso fará com 't_Co'que seja definido incorretamente como 8. Você está configurando manualmente 't_Co' novamente para 256, mas se você tivesse deixado a 'term'configuração no valor correto, não precisaria .

Aliás, quando você altera 't_Co'manualmente após a configuração g:impact_transbg, faz com que o esquema de cores seja recarregado (para permitir que o esquema de cores se adapte ao novo número de cores) e, como agora g:impact_transbg está definido, você obtém as cores desejadas.

(Com a configuração de linha 'term'omitida, 't_Co' está definido como 256 quando você chega à última linha no seu .vimrc e, portanto, o esquema de cores não é recarregado: portanto, cores incorretas.)

Então, para recapitular:

term=xterm
colorscheme impact3
let g:impact_transbg=1
set t_Co=256

Resultado: o esquema de cores é recarregado quando 't_Co'definido como 256, as cores estão corretas.

"term=xterm
colorscheme impact3
let g:impact_transbg=1
set t_Co=256

Resultado: o esquema de cores é carregado por colorschemecomando, a variável não existe, as cores estão erradas.

term=xterm
colorscheme impact3
let g:impact_transbg=1
"set t_Co=256

Resultado: o esquema de cores é carregado por colorschemecomando, a variável não existe e o Vim usa apenas 8 cores, as cores estão erradas.

"term=xterm
colorscheme impact3
let g:impact_transbg=1
"set t_Co=256

Resultado: o esquema de cores é carregado por colorschemecomando, a variável não existe, as cores estão erradas.

let g:impact_transbg=1
colorscheme impact3

Resultado: Colorscheme é carregado pelo colorschemecomando variável faz existe, então cores estão corretas. (E como um bônus 'term'e 't_Co'também estão corretos!)

O comportamento é diferente no NeoVim simplesmente porque a chamada para definir 't_Co'é ignorada, como outros atendentes já mencionaram.

'background'

Depois de definir o esquema de cores, você também define 'background'. Para este especial colorscheme, isso é completamente desnecessário, porque a primeira coisa que o colorscheme faz é conjunto 'background'para 'dark'.

Observe que eu discordo do outro respondente que sugere que você defina 'background'após carregar o esquema de cores. O esquema de 'background'cores pode usar o valor de para ajustar suas cores; portanto, a configuração 'background'antes de carregar o esquema de cores é a ordem mais óbvia. (Embora observe que, se você alterar a 'background'configuração, o Vim recarregará todos os esquemas de cores carregados, portanto, a configuração 'background'depois também funcionará: é simplesmente não ideal.)

Rico
fonte
11
Obrigado, isso é extremamente completo e eu aprecio o contexto adicional.
Conrad Meyer
@ConradMeyer Fico feliz que tenha sido útil para você!
Rich
7

No caso de Neovim, t_Coe TERMnão faça diferença.

Você está ligando set background=darkantes e depois da ligação para colorscheme impact3. Vá set background=darkpara a parte inferior do esquema de cores e remova a outra chamada do vimrc.

De :help 'background':

When 'background' is set Vim will adjust the default color 
groups for the new value.
...
When a color scheme is loaded (the "g:colors_name" variable 
is set) setting 'background' will cause the color scheme to 
be reloaded.

Consulte também: https://github.com/justinmk/molokai/commit/aa1cc201c743dd7d1b80bb2e2b5fbb7894ebfe5f

Meu objetivo é entender por que o xterm hack é necessário / funcionando no vim e por que não parece o mesmo no neovim.

  • O Neovim não se importa t_Coporque assume 256, a menos que você ative a "cor verdadeira" .
    • De fato, o Neovim ignora todas as t_*opções, veja :help t_xx.
  • Neovim não permite &termque seja definido porque não faz sentido. O Neovim usa o unibilium e outros mecanismos para detectar recursos terminais.
Justin M. Keyes
fonte
muito obrigado por suas idéias sobre detecção de capacidade de termo neovim e configurações `t_ *`. Remover a cópia redundante e reposicionar a set background=darkdeclaração não teve efeito, mas esses detalhes sobre a implementação subjacente são muito mais valiosos para mim.
Gall
2

Vejo que você usa o iTerm2, para que você possa tentar o seguinte:

  1. Abrir janela de preferências +,
  2. Vá para a profilesguia
  3. Verifique seu perfil atual na lista à esquerda
  4. Clique na aba terminalà direita
  5. Na Report terminal typeescolhaxterm-256color
  6. Feito.
Alexander Myshov
fonte
Obrigado por sua sugestão. Eu editei o acima com comentários sobre xterm-256color. Eu segui seu procedimento para encontrar o tipo de terminal já definido assim.
Gall
2

Está faltando um recurso incrível do NeoVim. Há um env var que ajuda com essas coisas. Tente colocar isso no seu nvimrc:

let $NVIM_TUI_ENABLE_TRUE_COLOR=1 " True gui colors in terminal

Ou

export NVIM_TUI_ENABLE_TRUE_COLOR=1

na concha.

Yann Vanhalewyn
fonte
FYI: isso exigirá o uso de guifge guibg. O esquema de cores do OP usa ctermfge ctermbg.
Justin M. Keyes
Oh, você está certo. Desculpe!
Yann Vanhalewyn
2

Você precisa configurar opções

let $NVIM_TUI_ENABLE_TRUE_COLOR=1 
set termguicolors

no seu .config/nvim/init.vim.

yqbk
fonte
Essas opções são para uso guifge guibgvalores RGB para cores. O esquema de cores da pergunta usa apenas ctermfge ctermbg.
Tommy A
11
Isso fez por mim. TERM já era xterm-256color. Obrigado!
Qix
1

Observe que o esquema de cores específico é realmente dois conjuntos de esquemas de cores dentro de uma cláusula if-else. A existência da variável g:impact_transbgseleciona o conjunto de cores desejado e foi originalmente planejada para levar em conta fundos transparentes no esquema de cores do qual isso é derivado .

Comentar o segundo esquema de cores e a instrução if-else (deixando apenas o esquema de cores desejado e eliminando g:impact_transbg) produz o comportamento pretendido no vim e no neovim, mesmo com set term=xterme set t_Co=256removidos.

Isso implica que $TERM=xterm-256colors, tanto no vim quanto no neovim, o condicional if exists("g:impact_transbg")falha, mas que a combinação de configuração

set term=xterm
set t_co=256

permitiu que o condicional fosse bem-sucedido. A remoção da cláusula if-else, conforme descrito acima, resolve o problema material, mas ainda há um mistério em relação à interação entre o par de configurações de termo .vimrc e g:impact_transbg.

Gall
fonte
0

Tente definir sua $TERMvariável de ambiente assim:

TERM=xterm-256color

Tente também iniciar o nvim assim:

export TERM=xterm-256color; nvim

Se isso funcionar, defina a $TERMvariável no seu shell permanentemente.

Jeff Buttas
fonte
Obrigado pela ideia, Jeff. Eu editei minha pergunta com comentários a respeito xterm-256color. Definir $ TERM via exportação não teve efeito.
Gall
0

Recentemente, tive esse problema com o tema solarizado. O problema veio da TERMvariável env.

Corrigi-o dizendo ao meu emulador de terminal (terminador no meu caso) para executar, em env TERM=xterm-256color zshvez de iniciar o zsh normalmente.

benbot
fonte
O OPs TERM já está definido como xterm-256color. Acho que você estava enfrentando um problema diferente.
25416 Rich