Prise en charge de tmux, TERM et 256 couleurs

48

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 colorsme disant qu'il n'y en a que 8.


Contexte

Commençons par le début.

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

Voyons ce qui se passe pour mon terminal . tput colorsdit il y a 8 couleurs. Personnellement, je les ai mis en violet, à gauche, et bien sûr à droite, nous avons 2 nuances de bleu. $TERMdit xterm. (Pour avoir la couleur lsje eval ceci dans mon .bashrc.)

entrez la description de l'image ici

Vim a également l’air très bien, malgré le fait que je l’appelle avec le 256drapeau dans un environnement où 256 couleurs ne sont pas supportées.

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

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

entrez la description de l'image ici

Mais appeler tmuxavec le -2drapeau fait que tout fonctionne correctement, comme par magie .

entrez la description de l'image ici

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

Guake se comporte de manière analogue à Terminal et les deux répondent xtermà la question echo $TERM.


Question

En gros, est-ce que quelqu'un comprend pourquoi tout fonctionne même si cela ne devrait pas?

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

Expériences supplémentaires

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

entrez la description de l'image ici

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

entrez la description de l'image ici

Plus de tests suivent.

De gauche à droite, de haut en bas, nous avons solarisée thème de la couleur, dircolor ansi-darket 256dark, puis par défaut ( Tango schéma de couleurs), dircolor ansi-darket 256dark.

entrez la description de l'image ici

Observation : en théorie, la palette de couleurs dircolor ansi-darksur Solarized devrait correspondre étroitement à la dircolor 256dark. Cela ne se produit pas clairement pour les fichiers listés spécifiques. Cela se produit plutôt lorsque, dans le répertoire de travail, il y a des dossiers , des fichiers texte et des liens symboliques . Conclusion : peu d'attention a été portée lors du codage des 256darkcouleurs.


Conclusions préliminaires

xtermsupporte 256 couleurs, malgré ce que tput colorsdit. Les programmes peuvent faire référence à la ansipalette (personnalisable par l'utilisateur) ou définir leurs couleurs, en choisissant parmi un total de 256 couleurs.

Atcold
la source
1
Lisez cette réponse et les commentaires ci-dessous. Répond-il à votre question? Consultez également ce script pour connaître le nombre réel de couleurs prises en charge.
terdon
Hum ... Je suis toujours un peu confus ... Mais, je suppose que je comprends au moins que ce tput colorstest n'est pas fiable. Pourriez-vous vérifier mes conclusions préliminaires ?
Atcold
2
Mon interprétation de la réponse de Gilleś est qu’elle tput colorsne peut renvoyer qu’une valeur et que dans les terminaux prenant en charge l’une quelconque des couleurs 2,8,16,88 ou 256 couleurs, seule la première valeur (8 dans votre cas) est renvoyée. Pour obtenir la vraie valeur, utilisez le script de mon dernier commentaire. Qu'est-ce que cela retourne?
terdon
Vérifiez mes expériences supplémentaires ci-dessus :)
Atcold
Ah, désolé, mon mauvais.
terdon

Réponses:

33

Il y a quelques informations sur le support 256 couleurs dans la FAQ de tmux .

Détecter le nombre de couleurs supportées 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 obtenir 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 supporte pas toutes les séquences de contrôle de xterm. En particulier, il ne prend pas en charge la 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, tmux commence par prendre en charge 256 couleurs, même s'il ne pense pas que votre terminal prenne en charge 256 couleurs (ce qui est assez courant).

Par défaut, tmux s'annonce comme screensans support 256 couleurs. Vous pouvez modifier la valeur de TERMin .tmux.confpour indiquer la prise en charge 256 couleurs:

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

Vous pouvez utiliser TERM=xterm-256colorou TERM=screen-256colorsur Ubuntu. Ces valeurs ne poseront problème que si vous vous connectez à une machine distante ne disposant pas d'une 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 les implémentations les plus modernes de terminfo.

# 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/
Gilles, arrête de faire le mal
la source
J'apprécie votre explication, mais je ne suis pas sûre que cela corresponde à ma question. Bien, je conviens que ma question était assez large, mais je ne me concentrais pas spécifiquement sur tmux . Réellement, tmux était le seul type à se comporter en conséquence. Ce qui était beaucoup plus mystérieux, c’est comment il a xtermété capable de me montrer 256 couleurs alors tput colorsque je disais 8. Je suppose que la réponse à cette question spécifique a été abordée par @terdon dans ses commentaires sur la question elle-même.
Atcold
@Acold C'est une longue question, mais pour autant que je sache, j'y ai répondu. Les parties non liées à tmux sont couvertes par la réponse à laquelle terdon et moi avons lié (et que j'ai écrite). Votre question aurait été une copie de celle-ci sans l’aspect tmux. Qu'attendiez-vous de plus d'une réponse?
Gilles 'SO- arrête d'être méchant'
1
@ Gilles , je ne voulais pas paraître méchant. J'essayais d'accréditer @terdon de la "réponse acceptée", même s'il se réfère à votre réponse dans une autre question. Malgré cela, la set -g default_terminal "screen-256color"commande n'est pas suffisante pour activer les 256 couleurs dans tmux . Vous devez alias tmux='export TERM=screen-256color; /usr/bin/tmux'( référence ).
Atcold
@Atcold Non, l'alias n'est pas nécessaire (j'ai testé). De plus, cet alias n'aurait pas de sens: il prétend à tmux qu'il tourne dans screen ou tmux. Cependant, vous devez fonctionner tmux -2conformément au paragraphe précédent, si tmux ne pense pas que votre terminal actuel prend en charge 256 couleurs, cela alias tmux='tmux -2'aurait donc un sens.
Gilles 'SO- arrête d'être méchant'
2
@Atcold Cette réponse de U & L a TERM=xterm-256color tmux, ce qui est raisonnable, contrairement àTERM=screen-256color tmux . tmux -2est supérieur parce que cela fonctionne même s'il screen-256colorne se trouve pas dans la base de données terminfo locale.
Gilles 'SO- arrête d'être méchant'
21

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

Alors voici quelques idées sur vos questions fondamentales:

  • Qu'est-ce qu'un terminal prend en charge et ce qu'il rapporte sont des choses différentes. Le terminal Gnome par exemple est capable d’afficher 256 couleurs, mais il s’annonce à l’environnement (via $TERMvariable) en tant xtermqu’émulateur (8 couleurs).

  • Des outils tels que tputsuit tout ce qui TERMest défini sur: tput colorspeut imprimer 8, alors que env TERM=xterm-256color tput colors256 en seront, indépendamment du fait que votre terminal prenne réellement en charge de telles capacités

  • vimsuivez également TERMpar défaut, mais comme vous lui avez 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 le supporte réellement .

  • tmux, tout comme Gnome Terminal, se présente également par défaut comme un terminal 8 couleurs. Mais contrairement à Gnome Terminal, il ne reste que fonctionnalité 256 couleurs que si vous utilisez l' -2indicateur, ce qui lui permet également de se signaler en tant xterm-256colorqu'émulateur compatible.

  • xterm, comme dans le logiciel d'émulateur de terminal pour le X11 , supporte 256 couleurs, bien sûr. Mais xtermcomme dans TERM=xtermest un "standard" de 8 couleurs. Cela signifie les capacités de l' original xterm . Lorsqu'il a été mis à niveau pour prendre en charge 256 couleurs, il y a longtemps, il a inventé ce xterm-256colorterme.

Donc tout se résume à:

  • Quelles sont les fonctionnalités actuellement prises en charge par votre terminal (et activées pour ce faire)

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

  • Comment les outils s'interprètent TERMet s'adaptent en conséquence.

  • Comme vous pouvez le déduire de ce qui précède, évitez de marteler export TERM=xterm-256colorvos ~/.bashrcscripts . Comme ces fichiers sont exécutés quel que soit le terminal que vous utilisez réellement, tous les vos terminaux, y compris les connexions distantes de Windows avec Putty, les terminaux de console Linux, etc., se présenteront comme compatibles xterm-256color. Ce qui peut être vrai pour certains mais certainement pas pour tous. Par exemple, gettyla console Linux à laquelle vous accédez CTRL+ALT+1..6n’a pas.

  • Les terminaux doivent se déclarer comme étant le "standard" avec lequel ils sont le plus compatibles. Si vous savez qu'ils peuvent gérer 256 couleurs, configurez-les pour qu'ils annoncent en tant que telles.

Dernier point mais non le moindre, une lecture étonnante à propos de TERM256 couleurs est:

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

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

MestreLion
la source
Un exemple de scénario ou deux serait un bon ajout à cette réponse.
Elijah Lynn
5

Je fournirai une réponse complémentaire qui ne concerne que vos expériences supplémentaires dans la mesure où elles concernent les couleurs de répertoire solarisées .

Installer

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

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

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 lxterminales non décorées empilées verticalement (3). A droite, vous avez un assemblage tmux montrant les mêmes programmes identiques (3). J'ai également inclus un 1 solarisé montrant nano en utilisant le fichier .Xresources inclus dans le package complet (et en l'échantillonnant avec ):xtermxrdb -load ~/.Xresources

entrez la description de l'image ici s'il vous plaît clic droit / voir l'image pour 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 solarisée dégradée . À l'exception du fond rose sur fond bleu pour les .cfichiers que j'ai ajoutés, il est identique à celui attendu (voir l'image ci-dessous pour référence). Par rapport aux valeurs par défaut, il s'appuie davantage sur les attributs étendus, à savoir gras / clair / inverse, etc., et les couleurs sont évidemment différentes. L'attribution des couleurs par défaut pour les .txtfichiers de nombreuses distributions est le vert, mais elle devrait être grise au lieu de la solaire . Un fichier ansi qui rend un fichier .txt en vert ne rend pas le rendu correctement ou ne le rend pas du tout. Les résultats du côté droit que vous avez indiqués sont les bons (256dark) par rapport à la référence suivante:

entrez la description de l'image ici carte de référence des dircolors solarisés "dégradés"

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 important dans la définition des fonctionnalités solarisées et une bonne police est nécessaire pour optimiser l'expérience. Les couleurs de répertoire solarisées 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 ansi rendu des couleurs du répertoire est juste complètement différent de avilis solarisée (256dark). À tel point que les fichiers sous ansi .txt 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 totalement différents.


la source
"Je ne comprends pas votre conclusion à propos du fait que le codage 256dark n'a pas fait l'objet de beaucoup d'attention, alors que c'est le seul fichier couleur qui donne une liste de répertoires solarisée?" Ma confusion provient du fait que j’envisageais que la ansi-darksortie soit correcte (car elle utilise la version non dégradée). Ensuite, si vous prenez comme référence la sortie du 256dark, alors vous avez la mentalité inversée.
Atcold
"Avec la configuration que j'ai utilisée, les résultats paraissent identiques à l'intérieur et à l'extérieur de tmux" Bien sûr, si vous utilisez 256 couleurs, ils seront bien sûr rendus de la même manière, quel que soit le mode de prise en charge de 256 couleurs. "On ne voit pas clairement ce que la solution ansi fournirait dans ce contexte ..." Le résultat serait d'avoir la vraie Solarisation (au lieu d'une approximation).
Atcold
Je comprends. Je n'ai pas vraiment cherché la partie ansi, je ne pouvais donc pas comprendre d'où vous veniez. En tout cas, j'ai trouvé votre Q assez habilitant merci. Peut-être que je vais utiliser vi plus maintenant que je trouve ça plutôt lol. En ce qui concerne les résultats de l'ansi, en fait, j'ai maintenant vu à quoi ça ressemble ... ils ne montrent que cela pour dir-colors ici . Pourquoi le h. ont-ils un codage différent sous cela ... je veux dire, je vois .txt vert ... comment le gris est-il proche du vert? Je ne comprends pas leur projet au sérieux.
Oui, j'ai contacté personnellement l'auteur et la réponse est que "c'était sa personnalisation personnelle, puisqu'il l'aimait de cette façon". Je suis sans voix ... je suis heureux que mon Q ait aidé quelqu'un :)
Atcold