Blog des Gens Compliqués

Problème de coloration syntaxique de vim dans tmux

14/04/2025 20:48:36+02:00|Par DkVZ
7 minutes de lecture (facile)

Dis donc monsieur du blog, là, j'ai rien compris à ton titre, je sais même pas pourquoi j'ai cliqué.

Auteur: Un visiteur imaginaire (comme tous mes visiteurs LOL)

Disons qu'on va parler un peu de Linux et des problèmes de premier monde rencontrés par leurs utilisateurs, là où le web francophone semble avoir un sérieux manquement.

Les résultats de recherche vis-à-vis de mon problème semblent être des fils de discussion Reddit traduits automatiquement.

Belle manoeuvre de la part de Reddit d'ailleurs.

En gros, pour vous raconter la petite histoire qui n'intéresse probablement personne, j'ai enfin remplacé mon vénérable ordinateur de travail qui est un ordi portable basse consommation (ou en tous cas haute autonomie, l'un implique généralement l'autre) — C'est à dire vraiment pas du tout un truc de G4m3R d'autant plus que j'utilise Linux pour bosser.

Ancien système: i5 8250U, maintenant Ryzen 8845HS
Manjaro ne m'a jamais posé de problèmes à part que je m'en moque un peu d'avoir zsh qui ralentissait mon terminal (je garde désormais le vieux bash d'Ubuntu)

Je profite de cette bouffée d'air frais pour améliorer quelque peu l'efficacité de mon environnement qui se résumait auparavant à BEAUCOUP de Alt+Tab et de combines foireuses de Tmux et Tilix, un émulateur de terminal sympathique sans être trop alien.

J'utilise d'ailleurs beaucoup plus les fonctionnalités de Tilix que de Tmux, que j'utilise plutôt sur les serveurs et de manière assez sommaire.

Je travaille sur un ordi portable, avec Linux (ben tiens), et un seul écran.

Déjà avant j'avais du mal à bosser sur deux écrans, mais maintenant j'y arrive vraiment plus du tout.

Le seul usage que j'aurais d'un deuxième écran c'est pour y poser une vidéo ou un stream, et alors je travaille plus trop en fait.

Autant terminer ce que j'ai à faire plus tôt puis regarder Dragon Ball Z.

Je suis dès lors devenu un grand usiteur des espaces de travail (dit aussi bureaux virtuels) et les raccourcis clavier qui vont bien. Certains qui existent par défaut, d'autres pas.

Soit, on parlera de ça plus tard. J'en profite enfin pour passer sur un vrai terminal pour les vrais gros NERDS Unixiens — J'utilise ce terme pour être inclusifs avec les gens sur Mac (et aussi les deux types aux monde qui sont sur un BSD).

J'ai choisi WezTerm pour sa config en Lua et sa simplicité et le fait qu'il a aussi des "onglets" (Alacritty, par exemple, n'en a pas).

C'est même pas le terminal le plus à la mode, je pense que c'est Ghostty et Kitty en ce moment. CEPENDANT ils n'ont pas de version Windows que je sache, et j'aimerais bien pouvoir éventuellement avoir le même terminal sous Windows pour diverses raisons que je peux pas aborder parce que cette brève est déjà beaucoup trop longue et j'ai même pas abordé son sujet principal.

Je dirai juste que je sous-estimais la différence de performances d'un terminal accéléré par GPU (qui n'est pas le Windows Terminal). Le programme il vomit juste du texte mais le débit du dit vomi est totalement différent, il suffit de cat un gros fichier ou suivre un fichier log assez intense pour le constater.

WezTerm supporte d'emblée la séparation de la fenêtre en plusieurs sous-terminaux (et les onglets, bien entendu) — Je pourrais le configurer comme Tmux et essayer de dépatouiller le mode "recherche" (j'en ai besoin pour copier coller efficacement) mais je me suis dit, tant qu'à faire, il est peut-être temps de perfectionner mon Tmux-age. J'ai déjà quelques réflexes qui me permettent de travailler avec.

Si vous n'êtes pas admin système je conseille pas trop Tmux. C'est un autre émulateur de terminal qu'on fait tourner dans l'émulateur de terminal. C'est pas top en l'essence même si ça a l'avantage d'être portable dans n'importe quel émulateur de terminal. J'ai beaucoup trop répété le terme émulateur de terminal. Je viens de le refaire.

En plus Tmux est un peu vieux et ultra-compatible avec d'autres vieux machins et présente parfois quelques soucis dont celui qui est le sujet de cette note n'est-ce pas.

Je dirais de soit utiliser le découpage de WezTerm, par ex., ou alors essayer Zellij, un concurrent de tmux un peu plus moderne et flashy (un poil plus lourd aussi évidemment).

Revenons à Tmux: je découvre qu'avec ma config minimaliste (j'aime bien m'approcher le plus possible du 0 config), il se passe un truc bizarre avec les couleurs. Je l'avais déjà remarqué sur les serveurs mais bon, je passe normalement pas 2 heures à éditer des bidules dans vim sur un serveur.

Là je commence aussi à entrainer davantage mon vim (je pense tenter une distrib complète de neovim dans les prochaines semaines (ou mois 👼)) et les couleurs foireuses m'embêtent. Exemple côte à côte:

Deux terminaux ouverts, l'un a tmux active l'autre pas, les couleurs dans vim sont différentes
Avec certains thèmes de couleur, c'est pire. Ceci dit ce vieux rouge revient à peu près tout le temps quand vim tourne dans tmux

Sur les Internets on trouve toujours la recommendation d'ajouter vaguement les mêmes directives de config à .tmux.conf:

set -g default-terminal "screen-256color" 
set-option -sa terminal-overrides ",xterm-256color:Tc"

Il existe une énorme quantité de variantes de ces deux lignes que je vais pas prétendre comprendre parce que je comprends pas. Du tout.

Je pense que personne ne comprends. Par exemple sur cette page l'aueur présente quelques options pour s'assurer d'avoir le support couleurs 24 bits (qui représente immensément plus de couleurs que 256 soit dit en passant) et il combine plusieurs options, avec des trucs commentés, qu'il explique pas.

Une série de variantes de config telles que décrites plus haut, certaines commentées et d'autres répétées
Cette personne semble avoir essayé trop de trucs, le Linuxien experimenté sait qu'il ne faut pas essayer trop de trucs [source]

Son seul commentaire, je vous le traduit en Français: Cette section est toujours un combat pour moi, je sais pas pourquoi. Ben ouais.

Je pense que la première option annonce aux applications le type de terminal qui est utilisé, ce qui suppose que l'hôte possède un FICHIER DE DEFINITION DE TERMINAL qui correspond au nom mentionné.

Voici un extrait d'un fichier de définition de terminal:

Série de caractères spéciaux pour shell (genre celles qui changent la couleur)

Ouais. Et il y en a qui trouvent que le yaml c'est pas génial.

Je pense que ce sont les séquences spéciales autorisées pour ce terminal, essayez de "cat" ce fichier et appréciez votre nouveau terminal tout ruiné. De rien.

Je pense que les fonctionnalités "annoncées" par ce type de fichiers comprennent les fonction de couleurs, le gras/italique, etc. Qui sont supportés où non par différents émulateurs de terminal.

Plus haut j'avais mis screen dans mon exemple, il s'agit d'un vieux multiplexeur de terminal (donc comme tmux) que vos grands parents ont sans doute utilisé. S'ils sont admins système.

En fait, je crois (????) qu'il est préférable de spécifier que le terminal est une variante de tmux (la "256 couleurs") sauf que si je me connecte à un vieux serveur, j'ai une vieille erreur comme quoi il sait pas ce que c'est tmux.

Evidemment je n'ai absolument aucune idée de ce que la ligne terminal-override est censée accomplir mais c'est celle-là qui semble fonctionner avec les vieux serveurs parce moi j'utilise ça:

set -g default-terminal "tmux-256color"
set -ga terminal-overrides ",xterm-256color:Tc"

Un jour je vais publier mes dotfiles.

A savoir que beaucoup de gens utilisent une variante de "RGB" au lieu de "Tc" dans mon exemple. Aucune idée de ce que ça change 🤔

Tout ça pour résoudre le premier problème: par défaut tmux n'est pas en mode couleurs 24bit il est en mode... Dans un autre mode (???).

Vous pouvez voler ce script pour tester dans votre terminal (inspectez toujours le code avant de l'exécuter).

Si les options manquent, vous avez ce résultat foireux (faut être dans tmux, hein):

les couleurs produites par le script mentionné plus haut sont saccadées, on voit qu'il y en a moins

Et ici on a le résultat correct:

les couleurs produites par le script mentionné plus haut se suivent de très près, on voit qu'il y en beaucoup plus

Tout ça c'est très bien mais ça ne résoud pas le problème qu'on a avec les couleurs dans vim.

C'est parce que le soucis vient de vim lui-même.

Il a ses propres thèmes de couleurs qui peuvent être activés (je conseille de ne PAS en activer pour avoir le même thème que le terminal) et il choisit quelles couleurs du thème utiliser selon que vous ayez un arrière-plan sombre ou clair dans votre terminal — et vim est incapable de le deviner donc par défaut il pense que vous êtes en mode clair.

Et je suis pas en mode clair.

La solution consiste à ajouter une option de config à votre .vimrc et à modifier selon le thème que vous utilisez. Ici pour les thèmes sombres:

set background=dark

Pour les thèmes clairs, commentez ou supprimez simplement l'option sinon les couleurs seront encore plus foireuses (les titres sont très clairs et impossibles à voir par ex.).

Et voilà, maintenant ça le fait.

Bon le soucis c'est que si je veux travailler dehors (LOL WHAT??), changer de sombre à clair au niveau d'Ubuntu c'est simple et ça peut facilement auto-modifier le thème de WezTerm (il y a un bloc de Lua à copier coller dans sa config) mais Firefox n'a pas l'air d'être au courant du changement, sans doute parce que c'est un SNAP DE MERDE.

Les snaps c'est plus sécurisé et depuis peu ça change rien au niveau perfs — OK mais visiblement ça change tout de même quelque chose.

Soit, un jour j'écrirait un script foireux pour changer tout de thème et modifier l'option automatiquement dans mon .vimrc.

En attendant, je vais pas dehors.

Commentaires

Il faut JavaScript activé pour écrire des commentaires ici

Ajouter un commentaire

Votre commentaire a été ajouté
(enfin, je pense)