Pourquoi les couleurs Vim sont-elles différentes à l'intérieur et à l'extérieur de tmux?

29

Environnement:

  • Fedora 25 (4.9.12-200.fc25.x86_64)
  • Terminal GNOME 3.22.1 utilisant la version 0.46.1 + GNUTLS de VTE
  • VIM - Vi IMproved 8.0 (12 septembre 2016, compilé le 22 février 2017 16:26:11)
  • tmux 2.2

J'ai récemment commencé à utiliser tmux et j'ai observé que les couleurs dans Vim changent selon que je cours à l'intérieur ou à l'extérieur de tmux. Ci-dessous sont des captures d'écran de Vim à l'extérieur (à gauche) et à l'intérieur (à droite) de tmux lors de la visualisation d'un diff Git:

entrez la description de l'image ici

Ma TERMvariable est

  • Tmux extérieur: xterm-256color
  • À l'intérieur de tmux: screen-256color

Vim rapporte ces types de terminaux comme prévu (via :set term?):

  • Tmux extérieur: term=xterm-256color
  • À l'intérieur de tmux: term=screen-256color

Vim signale également que les deux instances s'exécutent en mode 256 couleurs (via :set t_Co?):

  • Tmux extérieur: t_Co=256
  • À l'intérieur de tmux: t_Co=256

Il existe de nombreuses questions similaires concernant le fonctionnement de Vim en mode 256 couleurs dans tmux (la meilleure réponse que j'ai trouvée est ici ), mais je ne pense pas que ce soit mon problème compte tenu des informations ci-dessus.

Je peux dupliquer le problème en dehors de tmux si j'exécute Vim avec le type de terminal défini sur screen-256color:

$ TERM=screen-256color vim

Alors , qui me fait croire qu'il ya simplement une certaine différence entre les xterm-256coloret screen-256colorcapacités du terminal qui provoque la différence de couleur. Ce qui conduit à la question posée dans le titre: qu'est - ce qui, dans les capacités du terminal, fait que les couleurs Vim sont différentes? Je vois les différences entre courir :set termcapà l' intérieur et à l'extérieur de tmux, mais je suis curieux de savoir quelles variables provoquent réellement la différence de comportement.

Indépendamment de la question précédente, est-il possible que les couleurs Vim soient cohérentes lors de l'exécution à l'intérieur ou à l'extérieur de tmux? Certaines choses que j'ai essayées incluent:

  • Définir explicitement le terminal par défaut utilisé par tmux dans ~/.tmux.confdifférentes valeurs (certaines contre l'avis de la FAQ tmux ):
    set -g default-terminal "screen-256color"
    set -g default-terminal "xterm-256color"
    set -g default-terminal "screen.xterm-256color"
    set -g default-terminal "tmux-256color"
  • Démarrer tmux avec tmux -2.

Dans tous les cas, Vim a continué d'afficher différentes couleurs à l'intérieur de tmux.

Rusty Shackleford
la source
Pourriez-vous s'il vous plaît démarrer script, démarrer vim, quitter vimpuis quitter scriptle shell et joindre le typescriptfichier résultant ? Répétez ensuite les mêmes étapes avec à la TERM=screen-256color vimplace.
egmont
@egmont Voilà: typescript-xterm-256color et typescript-screen-256color .
Rusty Shackleford
1
Je peux voir des séquences d'échappement de 256 couleurs dans la xterm-256colorversion (recherchez "38; 5;" dans le fichier), mais je ne peux pas dans le screen-256color. Par exemple , là où il y a \e[38;5;81mdans xterm-256color(couleur n ° 81 sur la palette 256 couleurs, une nuance bleue du milieu), screen-256colorcontient à la \e[34mplace (le bleu standard de la palette 8 couleurs). La question principale est donc pourquoi Vim n'utilise pas la palette de 256 couleurs en cas de TERM=screen-256color.
egmont
Une autre chose intéressante est que la xterm-256colorversion semble imprimer l'écran deux fois, d'abord avec les couleurs héritées puis avec la palette de 256 couleurs. Recherchez par exemple "F1" dans le fichier, vous trouverez deux correspondances dans xterm-256color, la première avec la \e[34mcouleur, la seconde avec \e[38;5;81m. Je ne sais pas ce qui se passe ici.
egmont
Ajout set -g default-terminal "screen.xterm-256color"dans ~/.tmux.confet recharger la config dans tmux (<Cs>: source fichier ~ / .tmux.conf) a fonctionné pour moi (question fort). thx
dtrckd

Réponses:

16

tmuxne prend pas en charge la fonction terminfo bce(effacement des couleurs en arrière), qui vimvérifie si vous souhaitez utiliser son modèle de "couleurs par défaut".

Cette caractéristique de tmuxa été mentionnée à plusieurs reprises -

Thomas Dickey
la source
Exactement le genre de réponse intellectuellement satisfaisante que je cherchais. Merci!
Rusty Shackleford
17

J'ai eu le même problème avant. Les commentaires en bleu dans Vim étaient difficiles à lire. Dans .tmux.confje mets ceci:

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

Et dans .vimrc:

set background=dark

Maintenant, il ressemble à ceci et fonctionne à la fois dans Gnome Terminal et Cygwin: entrez la description de l'image ici

Vitalii Plagov
la source
3
Cela l'a résolu pour moi. Pour une raison quelconque, dans tmux, vim ne détectait pas de fond sombre. Le réglage explicite bg=darkdans mon vimrc l'a corrigé.
Adam Keenan
Étrange - mon $TERMintérieur et extérieur l' tmuxétaient "xterm-256color"et le fait de définir explicitement le motif le faisait aussi pour moi. Merci!
nronnei
A aussi fonctionné pour moi. Je pensais que le problème était sttermdû au fait que xfce4-terminaltout semblait confortable (les commentaires apparaissant à la cyanplace étaient bluetrès difficiles à lire avec un fond sombre). après ce changement, tout fonctionne bien. Mais n'oubliez pas d'ajouter unlet! skip_defaults_vim source $VIMRUNTIME/defaults.vimau fichier vimrc pour utiliser la coloration syntaxique, etc ...
Abinash Dash
2

Grâce à l'analyse par @ egmont des couleurs que Vim produisait quand TERM=screen-256color, j'ai été inspiré de regarder le schéma de couleurs que Vim utilise dans les deux scénarios.

Vim rapporte qu'il utilise le jeu de defaultcouleurs dans les deux cas. Je trouvais cela étrange parce que le jeu de defaultcouleurs sur Fedora 25 ( /usr/share/vim/vim80/colors/default.vim) ne semble pas correspondre aux couleurs que je vois réellement quand TERM=xterm-256color. Si je définis explicitement le schéma de couleurs en utilisant :colorscheme defaultquand TERM=xterm-256color, l'apparence de Vim change en celle quand TERM=screen-256color. Pour que les couleurs reviennent à ce qu'elles étaient lorsque j'ai démarré Vim pour la première fois, j'ai dû utiliser la ronpalette de couleurs. Le progrès!

J'ai trouvé une réponse Ask Ubuntu qui suggère que lorsque Vim signale qu'il utilise le jeu de defaultcouleurs, cela ne signifie pas nécessairement default.vimmais plutôt un jeu de couleurs spécifique au thème. Comme le souligne la réponse, un thème sombre (que j'utilise) correspond au ronschéma de couleurs, comme je l'ai découvert ci-dessus. (Même si ce message concerne Ubuntu, je suppose que l'OP utilisait GNOME.)

J'ai également trouvé une autre question qui semble décrire le même problème que j'ai. Je l'ai rencontré lors d'une recherche avant de poster cette question, mais, pour une raison quelconque, le schéma de couleurs ne m'a pas semblé pertinent.

J'ai fini par faire ce que @LapshinDmitry a fait dans sa réponse et colorscheme ronj'ai explicitement mis dans mon ~/.vimrcfichier. Maintenant, que je démarre Vim à l'intérieur ou à l'extérieur de tmux, les couleurs sont identiques. Le seul inconvénient est que si je change jamais mon thème de bureau d'une saveur sombre à une saveur claire, Vim ne passera pas automatiquement au jeu de couleurs de thème clair "par défaut", ce qui est apparemment peachpuff. Je peux vivre avec ça, car je ne changerai probablement jamais mon thème.

Je ne vais pas accepter cette réponse car je considère la définition explicite du jeu de couleurs dans ma ~/.vimrcsolution plutôt que la solution. Si quelqu'un peut expliquer pourquoi Vim charge un jeu de couleurs "par défaut" différent en fonction de la valeur de TERM, je serai heureux d'accepter cette réponse, car je suis plus intéressé à comprendre la cause racine. Je soupçonne que cela a quelque chose à voir avec la façon dont Vim interprète les capacités du terminal entre les deux fichiers terminfo.

Rusty Shackleford
la source
Je suis également curieux de savoir pourquoi vimse comporte de cette façon. Après tout, la bcecapacité ne devrait avoir rien à voir avec le nombre de couleurs disponibles.
egmont
@egmont J'ai interprété la réponse de @ ThomasDickey comme: 1) Vim vérifie la bcecapacité du terminal, 2) s'il est présent, sélectionnez le jeu de couleurs "A", 3) sinon, sélectionnez le jeu de couleurs "B". Je crois que la profondeur de couleur est la même dans les deux cas (c'est-à-dire 256 couleurs, comme le t_Comontre). C'est juste que le schéma de couleurs "B" sur mon système utilise uniquement une palette de 8 couleurs même si 256 couleurs sont possibles (je pense que cela explique ce que vous avez observé dans votre analyse typographique; veuillez me corriger si je me trompe). Rappelez-vous, après avoir exécuté :colorscheme ron, je vois des séquences d'échappement de 256 couleurs dans la même session Vim.
Rusty Shackleford
Merci pour l'explication - je ne vois toujours pas de raison derrière cela. Ça ne fait rien. vima des décisions de conception vraiment étranges.
egmont
0

Ma variable TERM est Outside tmux: xterm-256color Inside tmux: screen-256color

C'est correct et ça marche pour moi. Essayez-le avec un autre terminal (j'utilise urxvt) pour voir si Gnome Terminal est le problème. La

Vérifiez également COLORTERM(le mien est défini sur rxvt) et unset TERMCAP.

laktak
la source
Merci pour les suggestions. J'ai exécuté le même test avec urxvt (externe TERM est rxvt-unicode-256color) en utilisant une ~/.Xdefaultscouleur différente appropriée et malheureusement toujours observée à l'intérieur et à l'extérieur de tmux. Pour le scénario gnome-terminal, COLORTERMest truecoloret TERMCAPest vide à l'intérieur et à l'extérieur de tmux. Pour le scénario urxvt, COLORTERMest à l' rxvt-xpmextérieur et à l' truecolorintérieur de tmux, tandis qu'il TERMCAPest vide à l'intérieur et à l'extérieur de tmux.
Rusty Shackleford
@RustyShackleford c'est seulement pour Vim? Utilisez-vous des «termguicolors»? Jetez un œil :help xterm-true-colorou essayez avec une configuration Vim plus par défaut.
laktak
Je n'ai remarqué que le problème dans Vim jusqu'à présent (comme je l'ai dit, je n'ai commencé à utiliser tmux que récemment). Par exemple, mon invite de terminal et la sortie CLI de Git semblent avoir les mêmes couleurs à l'intérieur et à l'extérieur de tmux. Je ne mets pas termguicolorsdans mes rapports .vimrcet dans les deux cas. Je vais regarder la rubrique d'aide que vous avez référencée; Merci! :set termguicolors?notermguicolors
Rusty Shackleford
0

Pour ma propre référence plus tard, lorsque je goûterai sans aucun doute à Google cette configuration de ma prochaine machine.

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

Utilisez ces instructions pour obtenir les fichiers binaires et les DLL nécessaires dans le CHEMIN de Git bash:

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

Utilisez ces commandes pour configurer:

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