Problemi con l'utilizzo della combinazione di colori in NeoVim


16

Non ho una piena comprensione di come la mia termcombinazione di colori sta interagendo con l' impostazione in vim e questo sta impedendo la mia capacità di farlo visualizzare correttamente in neovim.

Nel mio file .vimrc, è necessario impostare il comportamento corretto della combinazione di colori in questione

set term=xterm
set t_Co=256

Se si omette una di queste impostazioni si ottiene una visualizzazione errata della combinazione di colori:

corretto Display a colori corretto errato Display a colori errato diverso errato Display a colori errato diverso

Lo schema è simile al seguente:

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

In neovim, termnon può essere impostato. Ho provato a invocare neovim con un $ TERM impostato manualmente in questo modo:

TERM=xterm nvim

Ciò ha prodotto la corretta visualizzazione dei colori in vim regolare (ovvero equivalente al termine di impostazione in .vimrc), ma in neovim è simile al seguente:

inserisci qui la descrizione dell'immagine

Perché la combinazione di set term=xterme set t_Co=256necessaria per produrre la corretta visualizzazione di questa combinazione di colori in vim e perché la combinazione equivalente di impostazioni produce un risultato diverso in neovim?

Modificare:

L'impostazione predefinita è $TERM=xterm256-color , che per qualche motivo deve essere sovrascritta xtermin vim regolare per rendere il display a colori corretto. Con la variabile d'ambiente di default 256, neovim si presenta così:

inserisci qui la descrizione dell'immagine

Questo è identico al normale VIM con xterm256-color, ma non come previsto. Il mio obiettivo è capire perché l'hack xterm è necessario / funziona in vim e perché non sembra lo stesso in neovim.

Si noti che molti dei colori vengono visualizzati correttamente con l'impostazione della variabile env di cui sopra, ad eccezione di numeri di riga e sfondo. Sospetto che il modo in cui i colori sono specificati in questa specifica combinazione di colori possa essere coinvolto.


1
$ TERM è già impostato su ciò che è generalmente considerato "corretto" sui sistemi moderni: abilitato a 256 colori. Quindi l'opzione t_Co, che normalmente è compatibile con terminali più vecchi, non dovrebbe essere necessaria. Cosa succede se si commentano entrambe le righe di configurazione?
David Lord,

@David Commentare entrambe le righe di configurazione è lo stesso di commentare set term=xterm.
Gall

Potresti includere uno screenshot della configurazione del colore iTerm che usi quando il tema viene visualizzato correttamente e l'output dell'esecuzione di questo script ?
Eric Pruitt il

Risposte:


11

Problema principale

Il problema principale che stai riscontrando è causato dall'ordinamento dei comandi nel tuo .vimrc.

Impostate la g:impact_transbgvariabile dopo aver caricato il colorscheme, quindi la variabile non esiste quando viene verificata dall'istruzione del colorscheme ife viene utilizzata la seconda versione del colorscheme (nel elseblocco).

Per risolvere, è sufficiente spostare la riga che imposta la variabile sopra la riga in cui si carica il schema dei colori:

let g:impact_transbg=1
colorscheme impact3

Puoi (e dovresti!) Quindi rimuovere le righe non necessarie dal tuo .vimrc:

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

Altri problemi

Posso anche chiarire alcune altre idee sbagliate / confusioni che potresti avere su come tutto questo funziona:

Spiegare il comportamento di 'term'&'t_Co'

Il tuo $ TERM è impostato su xterm256-color. Vim lo legge e interroga terminfo (o termcap) per scoprire quanti colori supporta il terminale, quindi imposta di 't_Co'conseguenza. Presumendo che $ TERM sia corretto (il tuo è) e il tuo database terminfo contiene le informazioni corrette per quel terminale (il tuo lo fa) che non dovresti mai dover reimpostare manualmente 't_Co'.

Tuttavia, stai impostando manualmente Vim's 'term'su xterm. Il tuo terminfo dice a Vim che questo terminale supporta solo 8 colori, quindi l'aggiunta di questo causerà 't_Co'un'errata impostazione su 8. Stai 't_Co' tornando manualmente a 256, ma se avessi lasciato l' 'term'impostazione sul valore corretto, non avresti bisogno di .

Per inciso, quando si cambia 't_Co'manualmente dopo l'impostazione g:impact_transbg, si fa ricaricare lo schema dei colori (per consentire allo schema dei colori di adattarsi al nuovo numero di colori) e, poiché ora g:impact_transbg è impostato, si ottengono i colori desiderati.

(Con l'impostazione della linea 'term'omessa, 't_Co'è già impostata su 256 quando si arriva a quest'ultima linea nel proprio .vimrc, quindi il colore non viene ricaricato: quindi colori sbagliati.)

Quindi, per ricapitolare:

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

Risultato: Colorscheme viene ricaricato quando 't_Co'è impostato su 256, i colori sono corretti.

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

Risultato: Colorscheme viene caricato per colorschemecomando, la variabile non esiste, i colori sono errati.

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

Risultato: Colorscheme viene caricato per colorschemecomando, la variabile non esiste e Vim utilizza solo 8 colori, i colori sono errati.

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

Risultato: Colorscheme viene caricato per colorschemecomando, la variabile non esiste, i colori sono errati.

let g:impact_transbg=1
colorscheme impact3

Risultato: colori è caricato dal colorschemecomando variabile fa esistere, così i colori sono corretti. (E come bonus 'term'e 't_Co'sono anche corretti!)

In NeoVim il comportamento è diverso semplicemente perché la chiamata da impostare 't_Co'viene ignorata, come già indicato da altri risponditori.

'background'

Dopo aver impostato il metodo dei colori, si imposta anche 'background'. Per questo particolare schema di colori, questo è del tutto inutile, perché la prima cosa che il colorscheme fa è di serie 'background'a 'dark'.

Nota che non sono d'accordo con l'altro risponditore che suggerisce che dovresti impostare 'background'dopo aver caricato il tuo schema dei colori. Il colorscheme può usare il valore di 'background'per regolare i suoi colori, quindi l'impostazione 'background'prima di caricare il colorscheme è l'ordinamento più ovvio. (Sebbene si noti che se si modifica l' 'background'impostazione, Vim ricaricherà tutti i colori caricati, quindi l'impostazione in 'background'seguito funzionerebbe anche: è semplicemente non ottimale.)


1
Grazie, questo è estremamente approfondito e apprezzo il contesto aggiuntivo.
Conrad Meyer,

@ConradMeyer Sono contento che ti sia stato utile!
Rich

7

Nel caso di Neovim, t_Coe TERMnon fare alcuna differenza.

Stai chiamando set background=darkprima e dopo la chiamata a colorscheme impact3. Passa set background=darkalla parte inferiore del schema dei colori e rimuovi l'altra chiamata dal tuo vimrc.

Da :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.

Vedi anche: https://github.com/justinmk/molokai/commit/aa1cc201c743dd7d1b80bb2e2b5fbb7894ebfe5f

Il mio obiettivo è capire perché l'hack xterm è necessario / funziona in vim e perché non sembra lo stesso in neovim.

  • A Neovim non importa t_Coperché assume 256 a meno che tu non abiliti il ​​"colore reale" .
    • In effetti Neovim ignora tutte le t_*opzioni, vedi :help t_xx.
  • Neovim non consente &termdi essere impostato perché non ha senso. Neovim utilizza unibilium e altri meccanismi per rilevare le capacità dei terminali.

grazie mille per i tuoi approfondimenti in merito al rilevamento della capacità del termine neovim e alle impostazioni `t_ *`. La rimozione della copia ridondante e il riposizionamento della set background=darkdichiarazione non hanno avuto alcun effetto, ma quei dettagli sull'implementazione sottostante sono molto più preziosi per me.
Gall

2

Vedo che usi iTerm2, quindi puoi provare questo:

  1. Apri la finestra delle preferenze +,
  2. Vai alla profilesscheda
  3. Controlla il tuo profilo corrente nell'elenco a sinistra
  4. Fai clic sulla scheda terminala destra
  5. Nella Report terminal typesceltaxterm-256color
  6. Fatto.

Grazie per il tuo suggerimento Ho modificato quanto sopra con osservazioni riguardanti xterm-256color. Ho seguito la tua procedura per trovare il tipo di terminale già impostato in questo modo.
Gall

2

Ti manca una fantastica funzionalità di NeoVim. C'è un var var che aiuta con queste cose. Prova a metterlo nel tuo nvimrc:

let $NVIM_TUI_ENABLE_TRUE_COLOR=1 " True gui colors in terminal

O

export NVIM_TUI_ENABLE_TRUE_COLOR=1

nel guscio.


Cordiali saluti: questo richiederà l'uso di guifge guibg. Lo schema di colori di OP utilizza ctermfge ctermbg.
Justin M. Keyes,

Oh, hai ragione. Scusate!
Yann Vanhalewyn,

2

Devi impostare le opzioni

let $NVIM_TUI_ENABLE_TRUE_COLOR=1 
set termguicolors

nel tuo .config/nvim/init.vim.


Tali opzioni sono per l'utilizzo guifge guibgvalori RGB per il colore. La combinazione di colori della domanda utilizza solo ctermfge ctermbg.
Tommy A

1
Questo è stato per me. TERM era già xterm-256color. Grazie!
Qix,

1

Si noti che la combinazione di colori specifica è in realtà due serie di combinazioni di colori all'interno di una clausola if-else. L'esistenza della variabile g:impact_transbgseleziona l'insieme desiderato di colori ed era originariamente intesa a tenere conto degli sfondi trasparenti nella combinazione di colori da cui deriva .

Commentando la seconda combinazione di colori e l'istruzione if-else (lasciando solo la combinazione di colori desiderata e eliminando g:impact_transbg) si ottiene il comportamento desiderato sia in vim che in neovim anche con set term=xterme set t_Co=256rimosso.

Ciò implica che con $TERM=xterm-256colorssia in vim che in neovim, il condizionale if exists("g:impact_transbg")fallisce, ma che la combinazione di impostazione

set term=xterm
set t_co=256

ha permesso al condizionale di avere successo. Rimuovere la clausola if-else come descritto sopra risolve il problema materiale, ma c'è ancora un mistero per quanto riguarda l'interazione tra la coppia di impostazioni del termine .vimrc e g:impact_transbg.


0

Prova a impostare la $TERMvariabile di ambiente in questo modo:

TERM=xterm-256color

Prova anche ad avviare nvim in questo modo:

export TERM=xterm-256color; nvim

Se funziona, imposta la $TERMvariabile nella shell in modo permanente.


Grazie per l'idea, Jeff. Ho modificato la mia domanda con osservazioni riguardanti xterm-256color. L'impostazione di $ TERM tramite esportazione non ha avuto effetto.
Gall,

0

Ho avuto questo problema di recente con il tema solarizzato. Il problema è venuto dalla TERMvariabile env.

L'ho risolto dicendo al mio emulatore di terminale (terminatore nel mio caso) di eseguire env TERM=xterm-256color zshinvece di avviare zsh normalmente.


Il TERM OPs è già impostato su xterm-256color. Penso che tu stia riscontrando un problema diverso.
Ricco
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.