web-dev-qa-db-fra.com

Vim: Différence entre t_Co = 256 et term = xterm-256color en conjonction avec TMUX

Je teste les différents terminaux que j'ai tendance à utiliser pour SSH dans des boîtes Linux sur lesquelles j'ai installé Tmux.

Fondamentalement, j'ai remarqué ce comportement et j'espère que quelqu'un pourrait offrir une explication de ce qui se passe. Il se peut maintenant que ce comportement spécifique affecte l'application Prompt.

J'utilise Vim dans Tmux, et sur l'application Prompt de Panic sur mon iPhone5, j'avais le comportement que 256 couleurs n'activaient pas lorsque le .vimrc définissez les couleurs à l'aide de set t_Co=256 directive. Ici, Vim affichait correctement les couleurs lorsqu'il n'était pas exécuté via Tmux. De plus, Terminal.app d'OS X a correctement rendu les couleurs (je n'ai pas testé PuTTY avec cela sur Windows malheureusement) avec Vim dans Tmux.

Ensuite, j'ai troqué set t_Co=256 pour set term=xterm-256color et maintenant les couleurs fonctionnent lors de l'utilisation de Vim via Tmux.

Notez également que j'ai testé les deux set -g default-terminal "xterm-256color" et set -g default-terminal "screen-256color" paramètres pour Tmux et cette modification n'a eu aucun effet sur le comportement.

37
Steven Lu

Lorsque vous n'utilisez pas tmux ou screen, il vous suffit de configurer vos émulateurs de terminaux pour qu'ils se présentent comme "capables d'afficher 256 couleurs" en définissant leur TERM sur xterm-256color ou toute valeur comparable compatible avec vos terminaux et plates-formes. La façon dont vous le ferez dépendra de l'émulateur de terminal et sort du cadre de votre question et de cette réponse.

Vous n'avez rien à faire dans Vim car il est parfaitement capable de faire la bonne chose par lui-même.

Lorsque vous utilisez tmux ou screen, ces programmes définissent leur propre valeur par défaut pour $TERM, généralement screen, et Vim fait ce qu'elle a à faire avec les informations qui lui sont données.

Si vous souhaitez un comportement plus uniforme (et coloré), vous devez les configurer pour utiliser une "meilleure" valeur pour $TERM:

  • tmux

    Ajoutez cette ligne à ~/.tmux.conf:

    set -g default-terminal "screen-256color"
    
  • écran

    Ajoutez cette ligne à ~/.screenrc:

    term "screen-256color"
    

Maintenant, les deux multiplexeurs diront à Vim qu'ils prennent en charge 256 couleurs et Vim fera ce que vous attendez de lui.

modifier

Ma réponse suppose que vous pouvez modifier ces fichiers de configuration mais, puisque vous pouvez modifier votre ~/.vimrc, Je ne pense pas que je suis si loin de la réalité.

modifier 2

La valeur de l'option term (récupérée avec &term) est le nom du terminal récupéré par Vim au démarrage. Ce nom est ce que vous êtes censé configurer dans votre émulateur de terminal lui-même.

La valeur de t_Co option (&t_Co) est ce que Vim considère comme le nombre maximum de couleurs pouvant être affichées par le terminal hôte. Il est défini selon l'entrée correspondant à $TERM dans terminfo:

 term            | t_Co
-----------------+------ 
 xterm           | 8
 xterm-256color  | 256
 screen          | 8
 screen-256color | 256

Au démarrage de Vim, il obtient la valeur de la variable d'environnement TERM, interroge la base de données terminfo avec cette valeur et stocke un certain nombre d'informations sur son environnement dans plusieurs t_… variables parmi lesquelles… le nombre de couleurs disponibles en t_Co. Étant donné un type de terminal "légal" (que Vim peut rechercher), Vim suppose toujours le nombre correct de couleurs.

Réglage t_Co à 256 en laissant term à sa valeur définie par Vim - ou, plus généralement, en définissant t_Co et/ou term à des valeurs qui ne correspondent pas au terminal hôte - n'a aucun sens et créera probablement des problèmes lorsque Vim envoie un signal qui n'est pas compris par le terminal ou vice-versa.

Bien qu'il soit tout à fait possible de le faire, jouer avec t_Co et term dans Vim est à la fois totalement inutile et peut-être dangereux.

Encore une fois, il suffit de configurer correctement vos émulateurs de terminaux et multiplexeurs de terminaux. C'est vraiment tout ce dont vous avez besoin.

Si vous vous retrouvez dans un multiplexeur de terminal ou un émulateur de terminal où vous ne pouvez pas définir un TERM correct, alors et seulement alors vous peut forcer Vim à assumer 256 couleurs. À cette fin, la modification de la valeur de t_Co est la seule chose qui ait du sens:

if &term == "screen"
  set t_Co=256
endif

Donc… si vous pouvez configurer chaque partie individuelle:

  • émulateur de terminal: xterm-256color
  • tmux/écran: screen-256color
  • vim: rien

et vous avez terminé.

Si vous ne pouvez pas contrôler chaque partie, utilisez un conditionnel simple dans votre ~/.vimrc mettre en place t_Co selon &term mais ne modifiez pas la valeur de term.

Mais si vous pouvez modifier un ~/.vimrc il n'y a aucune raison pour laquelle vous ne pouvez pas modifier un ~/.screenrc ou ~/.tmux.conf ou ~/.bashrc ou peu importe.

79
romainl

Vous pouvez utiliser les deux set t_Co=256 et set term=xterm-256color ensemble.

term indique à Vim quel type de terminal utiliser, qui contrôle l'affichage/le rendu de tous les aspects de Vim, y compris comment mapper la saisie des touches, redessiner l'écran, déplacer le curseur, afficher les couleurs, etc. Normalement, Vim peut comprendre cela via la variable d'environnement TERM fournie par votre système d'exploitation.

Il est souvent utile de le définir explicitement au cas où la valeur du système d'exploitation est incorrecte. Cela est particulièrement vrai si vous vous connectez sur un réseau à partir d'un émulateur de terminal qui ne fournit pas la valeur correcte.

t_Co est l'une des nombreuses options de terminal (utilisée par le système termcap que Vim utilise pour le contrôle du terminal). Il fait spécifiquement référence au nombre de couleurs prises en charge par le terminal. Parfois, vous devez remplacer cela si l'émulation de terminal est généralement correcte, mais Vim n'identifie pas correctement le nombre de couleurs prises en charge.

J'utilise ces deux options dans mon .vimrc pour s'assurer que Vim utilise 256 couleurs dans tmux en utilisant tous les terminaux que j'aime (gnome-terminal d'Ubuntu, iTerm2 d'OSX et KiTTY de Windows). J'ai également la plupart de ces terminaux explicitement configurés pour envoyer xterm-256color comme type de terminal.

8
Jim Stewart