Problème d'utilisation du jeu de couleurs dans NeoVim

16

Je ne comprends pas bien comment mon jeu de couleurs interagit avec le termparamètre dans vim et cela empêche ma capacité à l'afficher correctement dans neovim.

Dans mon fichier .vimrc, le comportement correct du jeu de couleurs en question nécessite la définition

set term=xterm
set t_Co=256

L'omission de l'un de ces paramètres entraîne un affichage incorrect du jeu de couleurs:

correct Affichage couleur correct incorrect Affichage couleur incorrect différent incorrect Affichage couleur incorrect différent

Le schéma ressemble à ceci:

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

Dans neovim, termne peut pas être défini. J'ai essayé d'appeler neovim avec un $ TERM défini manuellement comme ceci:

TERM=xterm nvim

Cela a produit l'affichage correct des couleurs dans vim régulier (c'est-à-dire équivalent à la définition d'un terme dans .vimrc), mais dans neovim, cela ressemble à ceci:

entrez la description de l'image ici

Pourquoi la combinaison de set term=xtermet set t_Co=256nécessaire pour produire l'affichage correct de ce jeu de couleurs dans vim et pourquoi la combinaison équivalente de paramètres produit un résultat différent dans neovim?

Éditer:

La valeur par défaut est $TERM=xterm256-color , qui, pour une raison quelconque, doit être remplacée xtermdans vim standard pour que l'affichage des couleurs soit correct. Avec la variable d'environnement à 256 par défaut, neovim ressemble à ceci:

entrez la description de l'image ici

C'est identique à vim régulier avec xterm256-color, mais pas comme prévu. Mon objectif est de comprendre pourquoi le hack xterm est nécessaire / fonctionne dans vim, et pourquoi il n'a pas la même apparence dans neovim.

Notez que la plupart des couleurs apparaissent correctement avec le paramètre de variable env ci-dessus, à l'exception notable des numéros de ligne et de l'arrière-plan. Je soupçonne que la façon dont les couleurs sont spécifiées dans ce schéma de couleurs spécifique peut être impliquée.

Fiel
la source
1
Votre $ TERM est déjà réglé sur ce qui est généralement considéré comme «correct» sur les systèmes modernes - 256 couleurs activées. Ainsi, l'option t_Co, qui est normalement pour la compatibilité avec les terminaux plus anciens, ne devrait pas être nécessaire. Et si vous commentez les deux lignes de configuration?
David Lord
@David La mise en commentaire des deux lignes de configuration ressemble à la mise en commentaire set term=xterm.
Gall
Pourriez-vous inclure une capture d'écran de la configuration des couleurs iTerm que vous utilisez lorsque le thème est rendu correctement ainsi que la sortie de l'exécution de ce script ?
Eric Pruitt

Réponses:

11

Problème principal

Le principal problème que vous rencontrez est dû à l'ordre des commandes dans votre .vimrc.

Vous définissez la g:impact_transbgvariable après avoir chargé le jeu de couleurs, et donc la variable n'existe pas lorsqu'elle est vérifiée par l' ifinstruction du jeu de couleurs , et la deuxième version du jeu de couleurs (dans le elsebloc) est utilisée.

Pour résoudre ce problème, il vous suffit de déplacer la ligne qui définit la variable au-dessus de la ligne où vous chargez le schéma de couleurs:

let g:impact_transbg=1
colorscheme impact3

Vous pouvez (et devriez!) Puis supprimer les lignes inutiles de votre .vimrc:

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

Autres issues

Je peux également clarifier quelques autres idées fausses / confusions que vous pourriez avoir sur la façon dont tout cela fonctionne:

Expliquer le comportement de 'term'&'t_Co'

Votre $ TERM est défini sur xterm256-color. Vim lit cela et interroge terminfo (ou termcap) pour savoir combien de couleurs le terminal prend en charge, puis définit en 't_Co'conséquence. En supposant que votre $ TERM est correct (le vôtre l'est) et que votre base de données terminfo contient les informations correctes pour ce terminal (le vôtre le fait), vous ne devriez jamais avoir besoin de réinitialiser manuellement 't_Co'.

Cependant, vous définissez ensuite manuellement Vim's 'term'sur xterm. Votre terminfo indique à Vim que ce terminal ne prend en charge que 8 couleurs, donc l'ajout de cela entraînera 't_Co'une valeur incorrecte de 8. Vous 't_Co' revenez manuellement à 256, mais si vous aviez laissé le 'term'paramètre à la valeur correcte, vous n'auriez pas eu besoin de .

Par ailleurs, lorsque vous modifiez 't_Co'manuellement après le réglage g:impact_transbg, cela provoque le rechargement du schéma de couleurs (pour permettre au schéma de couleurs de s'adapter au nouveau nombre de couleurs), et parce qu'il g:impact_transbg est maintenant défini, vous obtenez les couleurs que vous désirez.

(Avec le paramètre de ligne 'term'omis, 't_Co'est déjà défini sur 256 lorsque vous arrivez à la dernière ligne dans votre .vimrc, et donc le schéma de couleurs n'est pas rechargé: d'où des couleurs incorrectes.)

Donc, pour récapituler:

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

Résultat: Colorscheme est rechargé lorsqu'il 't_Co'est réglé sur 256, les couleurs sont correctes.

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

Résultat: Colorscheme est chargé par la colorschemecommande, la variable n'existe pas, les couleurs sont incorrectes.

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

Résultat: Colorscheme est chargé par la colorschemecommande, la variable n'existe pas et Vim n'utilise que 8 couleurs, les couleurs sont incorrectes.

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

Résultat: Colorscheme est chargé par la colorschemecommande, la variable n'existe pas, les couleurs sont incorrectes.

let g:impact_transbg=1
colorscheme impact3

Résultat: Colorscheme est chargé par la colorschemecommande, la variable ne existent, si les couleurs sont correctes. (Et en bonus 'term'et 't_Co'sont également corrects!)

Le comportement est différent dans NeoVim simplement parce que l'appel à set 't_Co'est ignoré, comme d'autres répondeurs l'ont déjà mentionné.

'background'

Après avoir défini le schéma de couleurs, vous définissez également 'background'. Pour ce particulier colorscheme, cela est tout à fait inutile, parce que la première chose que le fait colorscheme est de mettre 'background'à 'dark'.

Notez que je suis en désaccord avec l'autre répondeur qui suggère que vous devez définir 'background'après avoir chargé votre schéma de couleurs. Le schéma de couleurs peut utiliser la valeur de 'background'pour ajuster ses couleurs, donc le réglage 'background'avant le chargement du schéma de couleurs est l'ordre le plus évident. (Bien que notez que si vous modifiez le 'background'paramètre, Vim rechargera tous les schémas de couleurs chargés, donc le définir 'background'ensuite fonctionnerait également: ce n'est tout simplement pas optimal.)

Riches
la source
1
Merci, c'est extrêmement approfondi et j'apprécie le contexte supplémentaire.
Conrad Meyer
@ConradMeyer Je suis content que cela vous ait été utile!
Rich
7

Dans le cas de Neovim, t_Coet TERMne faites aucune différence.

Vous appelez set background=darkavant et après l'appel à colorscheme impact3. Déplacez- set background=darkvous au bas du schéma de couleurs et supprimez l'autre appel de votre 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.

Voir également: https://github.com/justinmk/molokai/commit/aa1cc201c743dd7d1b80bb2e2b5fbb7894ebfe5f

Mon objectif est de comprendre pourquoi le hack xterm est nécessaire / fonctionne dans vim, et pourquoi il n'a pas la même apparence dans neovim.

  • Neovim s'en fiche t_Cocar il suppose 256 sauf si vous activez la "vraie couleur" .
    • En fait, Neovim ignore toutes les t_*options, voir :help t_xx.
  • Neovim ne permet pas &termd'être défini car il n'a pas de sens. Neovim utilise unibilium et d'autres mécanismes pour détecter les capacités des terminaux.
Justin M. Keyes
la source
merci beaucoup pour vos idées concernant la détection de capacité de terme neovim et les paramètres `t_ *`. La suppression de la copie redondante et le repositionnement de la set background=darkdéclaration n'ont pas eu d'effet, mais ces détails sur l'implémentation sous-jacente sont beaucoup plus précieux pour moi.
Gall
2

Je vois que vous utilisez iTerm2, vous pouvez donc essayer ceci:

  1. Ouvrir la fenêtre des préférences +,
  2. Aller à l' profilesonglet
  3. Vérifiez votre profil actuel dans la liste de gauche
  4. Cliquez sur l'onglet terminalà droite
  5. Dans le Report terminal typechoixxterm-256color
  6. Terminé.
Alexander Myshov
la source
Merci pour votre suggestion. J'ai édité ce qui précède avec des remarques concernant xterm-256color. J'ai suivi votre procédure pour trouver le type de terminal déjà défini ainsi.
Gall
2

Vous manquez une fonctionnalité impressionnante de NeoVim. Il y a un var env qui aide avec ce genre de choses. Essayez de mettre ceci dans votre nvimrc:

let $NVIM_TUI_ENABLE_TRUE_COLOR=1 " True gui colors in terminal

Ou

export NVIM_TUI_ENABLE_TRUE_COLOR=1

dans la coquille.

Yann Vanhalewyn
la source
FYI: cela nécessitera l'utilisation de guifget guibg. Le schéma de couleurs d'OP utilise ctermfget ctermbg.
Justin M. Keyes
Oh, tu as raison. Pardon!
Yann Vanhalewyn
2

Vous devez configurer des options

let $NVIM_TUI_ENABLE_TRUE_COLOR=1 
set termguicolors

dans votre .config/nvim/init.vim.

yqbk
la source
Ces options sont pour l'utilisation guifget les guibgvaleurs RVB pour la couleur. Le jeu de couleurs de la question utilise uniquement ctermfget ctermbg.
Tommy A
1
Cela l'a fait pour moi. TERM était déjà xterm-256color. Merci!
Qix
1

Notez que le jeu de couleurs spécifique est en réalité deux ensembles de jeux de couleurs dans une clause if-else. L'existence de la variable g:impact_transbgsélectionne l'ensemble de couleurs souhaité et était à l'origine destinée à prendre en compte les arrière-plans transparents dans le jeu de couleurs dont elle est dérivée .

La mise en commentaire du deuxième schéma de couleurs et de la déclaration if-else (ne laissant que le schéma de couleurs souhaité g:impact_transbget supprimant) donne le comportement prévu à la fois dans vim et neovim, même avec set term=xtermet set t_Co=256supprimé.

Cela implique que $TERM=xterm-256colorsdans vim et neovim, le conditionnel if exists("g:impact_transbg")échoue, mais que la combinaison de la définition

set term=xterm
set t_co=256

a permis au conditionnel de réussir. La suppression de la clause if-else comme décrit ci-dessus résout le problème matériel, mais il y a toujours un mystère concernant l'interaction entre la paire de paramètres de termes .vimrc et g:impact_transbg.

Fiel
la source
0

Essayez de définir votre $TERMvariable d'environnement comme ceci:

TERM=xterm-256color

Essayez également de démarrer nvim comme ceci:

export TERM=xterm-256color; nvim

Si cela fonctionne, définissez la $TERMvariable dans votre shell de façon permanente.

Jeff Buttas
la source
Merci pour l'idée, Jeff. J'ai édité ma question avec des remarques concernant xterm-256color. La définition de $ TERM via l'exportation n'a eu aucun effet.
Gall
0

J'ai eu ce problème récemment avec le thème solarisé. Le problème venait de la TERMvariable env.

Je l'ai corrigé en disant à mon émulateur de terminal (terminateur dans mon cas) de s'exécuter env TERM=xterm-256color zshau lieu de simplement démarrer zsh comme d'habitude.

benbot
la source
Le terme OPs est déjà défini sur xterm-256color. Je pense que vous rencontriez un problème différent.
Rich