web-dev-qa-db-fra.com

Prise en charge de tmux, TERM et 256 couleurs

Introduction

Ma question découle de la nécessité de comprendre pourquoi j'ai maintenant (après plusieurs essais) Terminal et tmux prenant en charge 256 couleurs et tput colors me disant qu'il n'y en a que 8.


Contexte

Commençons depuis le début.

J'utilise une boîte Ubuntu, Guake, tmux, Vim et J'adore le thème Solarized. Ils avaient l'air assez horribles, j'ai donc décidé d'activer le support 256 couleurs et de jouer un peu.

Voyons ce qui se passe pour mon Terminal. tput colors dit qu'il y a 8 couleurs. Personnellement, je les ai mis au violet, à gauche, et bien sûr à droite, nous avons 2 nuances de bleu différentes. $TERM dit xterm. (Pour avoir la couleur ls I evalthis dans mon .bashrc.)

enter image description here

Vim semble également bien, malgré le fait que je l'appelle avec le 256 flag dans un environnement où 256 couleurs ne sont pas non prises en charge .

set t_Co=256
let g:solarized_termcolors=256
colorscheme solarized

Le seul gars qui se plaint de l'espace colorimétrique réduit est tmux. L'appel de tmux fournit les "mauvais" résultats attendus.

enter image description here

Mais appeler tmux avec le -2 flag fait tout fonctionner correctement, comme par magie.

enter image description here

Maintenant, la seule chose que je comprends, c'est que -2 est équivalent à export TERM=screen-256color ( source ).

Guake se comporte de façon analogue à Terminal et tous deux répondent xterm à la question echo $TERM.


Question

Fondamentalement, quelqu'un comprend-il pourquoi tout fonctionne même s'il ne devrait pas l'être?

  • Suis-je sadique de me plaindre pourquoi les choses fonctionnent? Peut-être.
  • Y a-t-il une meilleure raison? Bien sûr: je voudrais corriger l'apparence des autres boîtes Ubuntu dans mon bureau, et je voudrais comprendre pourquoi les choses fonctionnent ou ne fonctionnent pas.

Expériences supplémentaires

L'exécution de ce script (légèrement modifié) sur mon xterm fournit le résultat suivant: 256 couleurs, mais seulement 16 sont affichées correctement.

enter image description here

Ensuite, en changeant le profil du terminal, ces 16 couleurs changent également.

enter image description here

D'autres tests suivent.

De gauche à droite, de haut en bas, nous avons Solarized thème de couleur, dircoloransi-dark et 256dark, puis par défaut ( Tango) jeu de couleurs, dircoloransi-dark et 256dark.

enter image description here

Observation : en théorie, le dircoloransi-dark on Solarized le jeu de couleurs doit correspondre étroitement au dircolor256dark. Cela ne se produit pas clairement pour les fichiers répertoriés spécifiques. Au lieu de cela, cela se produit tout à fait quand dans le répertoire de travail il y a dossiers, fichiers texte et liens symboliques. Conclusion : pas beaucoup d'attention lors de l'encodage du 256dark couleurs.


Conclusions préliminaires

xterm prend en charge 256 couleurs, malgré ce que tput colors dit. Les programmes peuvent se référer à la palette ansi (personnalisable par l'utilisateur) ou définir leurs couleurs, en choisissant parmi un total de 256 couleurs.

51
Atcold

Il y a quelques informations sur la prise en charge de 256 couleurs dans tmux FAQ .

Détecter le nombre de couleurs prises en charge par le terminal n'est malheureusement pas simple, pour des raisons historiques. Voir Vérification du nombre de couleurs prises en charge par mon émulateur de terminal pour une explication. Cela signifie que

  • tmux ne peut pas déterminer de manière fiable si le terminal prend en charge plus de 8 couleurs;
  • tmux ne peut pas communiquer de manière fiable à l'application qu'il prend en charge plus de 8 couleurs.

Lorsque vous êtes dans tmux, le terminal avec lequel vous interagissez est tmux. Il ne prend pas en charge toutes les séquences de contrôle de xterm. En particulier, il ne prend pas en charge le OSC 4 ; … séquence de contrôle pour interroger ou définir des valeurs de couleur. Vous devez l'utiliser lors de l'exécution directe dans xterm, en dehors de tmux.

Si vous exécutez tmux -2, puis tmux démarre avec une prise en charge de 256 couleurs, même s'il ne pense pas que votre terminal prend en charge 256 couleurs (ce qui est assez courant).

Par défaut, tmux s'annonce comme screen sans prise en charge de 256 couleurs. Vous pouvez modifier la valeur de TERM dans .tmux.conf pour indiquer la prise en charge de 256 couleurs:

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

Vous pouvez utiliser TERM=xterm-256color ou TERM=screen-256color sur Ubuntu. Ces valeurs ne causeront des problèmes que si vous vous connectez à une machine distante qui n'a pas d'entrée termcap/terminfo pour ces noms. Vous pouvez copier les entrées dans votre répertoire personnel sur la machine distante; cela fonctionne avec la plupart des implémentations terminfo modernes.

# From the Ubuntu machine to a machine that doesn't have *-256color terminfo entries
ssh somewhere.example.com mkdir -p .terminfo/s .terminfo/x
scp -p /lib/terminfo/s/screen-256color somewhere.example.com:.terminfo/s/
scp -p /lib/terminfo/x/xterm-256color somewhere.example.com:.terminfo/x/

Je suis impressionné par la richesse de la mise en forme et du détail des réponses (et de la question!). Bien qu'ils fournissent des informations et des solutions précieuses sur les outils que vous avez mentionnés, ils fournissent très peu d'informations sur ce qui se passe, et, plus important encore, pourquoi les choses fonctionnent (quelque peu) pour certains outils alors qu'elles ne devraient pas.

Voici donc un aperçu de vos questions fondamentales:

  • Ce qu'un terminal supporte et ce qu'il rapporte sont des choses différentes. Le terminal Gnome par exemple est capable d'afficher 256 couleurs, mais il annonce lui-même à l'environnement (via $TERM variable) en tant qu'émulateur xterm (8 couleurs).

  • Des outils comme tput suivent ce que TERM est réglé sur: tput colors peut imprimer 8, tandis que env TERM=xterm-256color tput colors affichera 256, peu importe si votre terminal prend en charge de telles capacités.

  • vim suit également TERM par défaut, mais comme vous lui a dit d'utiliser 256 couleurs (via le drapeau ou le set t_Co=256), il utilisera 256 couleurs. Et cela fonctionne parce que votre terminal prend en charge cela.

  • tmux, tout comme Gnome Terminal, se présente également par défaut comme un terminal 8 couleurs. Mais, contrairement à Gnome Terminal, il ne permet que - active 256 couleurs si vous utilisez le -2 flag, ce qui en fait également rapport lui-même en tant que xterm-256color émulateur compatible.

  • xterm, comme dans le logiciel d'émulation de terminal pour le X11, supporte 256 couleurs, c'est sûr. Mais xterm comme dans TERM=xterm est un "standard" à 8 couleurs. Cela signifie les capacités du originalxterm. Lorsqu'il a été mis à niveau pour prendre en charge 256 couleurs, il y a longtemps, il a inventé le xterm-256color terme pour cela.

Donc, tout se résume à:

  • Quelles capacités votre terminal prend-il réellement en charge (et est autorisé à le faire)

  • Comment il signale ces capacités à l'environnement via TERM

  • Comment les outils interprètent TERM et s'ajustent en conséquence.

  • Comme vous pouvez le déduire de ce qui précède, éviter de marteler export TERM=xterm-256color dans ton ~/.bashrc et ces scripts. Comme ces fichiers sont exécutés quel que soit le terminal que vous utilisez réellement, cela fera tous vos terminaux, y compris les connexions à distance depuis Windows avec PuTTY, le terminal de console Linux, etc., se rapporteront comme xterm- Compatible 256 couleurs. Ce qui peut être vrai pour certains mais certainement pas pour tous. Par exemple, getty, la console Linux à laquelle vous accédez avec CTRL+ALT+1..6, ne fait pas.

  • Les terminaux doivent se déclarer comme la "norme" avec laquelle ils sont le plus compatibles. Si vous savez qu'ils peuvent gérer 256 couleurs, configurez-les pour qu'ils s'affichent comme tels.

Dernier point mais non le moindre, une lecture étonnante sur TERM et 256 couleurs est:

http://blog.sanctum.geek.nz/term-strings/

http://blog.sanctum.geek.nz/256-colour-terminals/

25
MestreLion

Je fournirai une réponse complémentaire qui ne concerne que vos expériences supplémentaires dans la mesure où elles se rapportent aux couleurs du répertoire solarisé.

Configuration

Nous avons la même sortie couleur du script de test. La seule différence est que j'ai utilisé lxterminal sur Openbox avec slim, xcompmgr et pas de DM. Par conséquent, je ne peux pas facilement définir une palette personnalisée comme vous l'avez fait car cet émulateur de terminal n'offre pas ces paramètres dans une interface graphique et il n'y a pas de thème spécifique pour cela (ceux-ci n'existent que pour quelques émulateurs de terminal ). Donc, j'utilise juste de la translucidité, des terminaux non décorés et ce bleu comme couleur de premier plan avec un arrière-plan bleu Gentoo. Comme je ne peux pas utiliser les versions ansi des fichiers couleur, je me suis concentré exclusivement sur l'obtention de résultats avec dircolors.256dark c'est-à-dire la version simple "dégradée".

J'ai utilisé la configuration pertinente suivante et la police moyenne inconsolata:

echo $TERM
xterm

.bashrc:
eval `dircolors /path/to/dircolors.256dark`

.vimrc:
set t_Co=256
let g:solarized_termcolors=256
syntax enable
set background=dark
colorscheme solarized

.tmux.conf:
nothing at all related to colors!
start tmux with "tmux -2"

Dircolors

L'image ci-dessous montre ce qui se passe à l'intérieur et à l'extérieur de tmux avec ces paramètres. Le premier tiers à gauche montre des fenêtres non décorées lxterminal empilées verticalement (3). A droite vous avez un tmux Assemblage montrant les mêmes programmes identiques (3) J'ai également inclus un solarizedxterm1 montrant nano en utilisant le fichier .Xresources inclus dans le package complet (et en l'échantillonnant avec xrdb -load ~/.Xresources):

enter image description here  veuillez cliquer avec le bouton droit/voir l'image pour l'inspecter en pleine résolution

Le premier terminal dans le coin supérieur gauche présente les couleurs de répertoire par défaut. Juste en dessous se trouve la version dégradée solarisée. Sauf pour le rose sur fond bleu pour .c fichiers que j'ai ajoutés, il est identique à ce qui est attendu de cela (voir l'image ci-dessous pour référence). Par rapport aux valeurs par défaut, il s'appuie davantage sur les attributs étendus, c'est-à-dire gras/clair/inversé, etc. et les couleurs sont évidemment différentes. L'attribution de couleur par défaut pour .txt les fichiers dans de nombreuses distributions sont verts, mais ils devraient être gris à la place lorsque solarized. Un fichier ansi rendant un fichier .txt en vert n'est pas rendu correctement ou pas du tout. Les résultats de droite que vous avez montrés sont les bons (256dark) par rapport à la référence suivante:

enter image description here  dircolors "dégradés" solarisés carte de référence

Observations

Avec la configuration que j'ai utilisée, les résultats semblent identiques à l'intérieur et à l'extérieur de tmux (J'ai inversé les commentaires (#) dans vi mais sinon le plugin se comporte comme il se doit et le multiplexeur n'a aucun impact sur cela) . Les polices jouent un rôle énorme dans la définition des fonctionnalités solarized, et une bonne police est requise pour maximiser l'expérience. Les couleurs du répertoire solarized utilisant le fichier 256dark correspondent à la référence et ne nécessitent aucune configuration d'émulateur de terminal spécifique.


Conclusion

En fait, le rendu ansi des couleurs du répertoire est juste complètement différent de celui dégradé solarisé (256dark). Tant et si bien que sous ansi.txt les fichiers sont verts. L'un ne peut pas être utilisé pour valider le rendu de l'autre. Les deux solutions nécessitent une configuration différente et produisent des résultats entièrement différents.

5
user44370