Artisan Numérique

/cli/terminal/bureau minimaliste/urxvt/xterm/ Une console performante

La console est un élément central sous *nix. Il n'est pas ici question de nostalgie mais d'efficacité. La ligne de commande demande certes un apprentissage parfois pénible, mais une fois "maîtrisée", elle permet en contrepartie d'atteindre un niveau de finesse difficilement atteignable par une interface graphique.

Mais voilà, depuis que je suis passé sous Gnome, c'est la console de ce dernier que je trouve pénible. Fatigué par sa lenteur, je me suis enfin décidé de me mettre à la recherche d'un quelque chose qui approche la vélocité de l'excellent Konsole.

Gnome-terminal est il vraiment si lent ?

Tout est relatif évidement et la lenteur est elle aussi une question d'usage. Mais lorsque nous sommes amenés à exploiter une dizaine de terminaux, chaque jour, en permanence, gnome-terminal atteint malgré tout de véritable sommets.

Ce constat est particulièrement crédible lorsque nous sommes habitués à Konsole, le terminal de KDE. En comparaison la mouture GTK, car nous le verrons, ce n'est pas un problème spécifique à Gnome, se traîne comme pas possible.

Pour clore d'emblée un débat sur le paramétrage de l'outil et les "meilleures" options, j'ai à peu près tout essayé, en passant par la suppression de la barre de défilement, l'utilisation de polices non vectorielles, la suppression de la transparence, etc. Mais quelle que soit le paramétrage, un log apache colorisé et un peu dense continue à faire diablement ramer mon U810 (processeur ATOM, chipset intel) sur lequel j'ai localisé (avec un écran externe) toutes mes consoles. Et c'est sans compter sur certains bugs problématiques qui impliquent, lorsque la charge augmente, que la sélection d'un onglet se transforme en décrochage du terminal associé en fenêtre flottante. Ce n'est pas un gros problème mais c'est tout de même très irritant.

Pour sortir du subjectif, j'ai donc effectué un petit test simple qui n'a pour autre objectif qu'afficher une longue suite de phrase avec une coloration ANSI :

#! /bin/bash

for x in $(seq 10000) ; do
  echo -e "#$x - \033[0;33mcoucou\033[1;39m, Ceci est un test\033[0m"
done
script vitesse-console.sh - test de vitesse d'affichage

La colorisation en question est importante car mes problèmes de consoles n'apparaissent évidement pas lorsque j'y tape trois commandes mais plutôt lorsque je les utilises pour analyser les logs Apache pendant les phases de debuggage d'application WEB. Logs que je colorise pour gagner du temps. Et là ce sont souvent des avalanches de lignes qui arrivent dans le terminal avec le besoin que ce dernier reste malgré tout réactif notamment pour remonter en pleine "crise" dans l'historique.

Pour tester la vélocité de l'affichage, j'utilise la commande time :

gastontime -f "%e secondes" ./Bureau/vitesse-console.sh
0 - coucou, Ceci est un test
1 - coucou, Ceci est un test
2 - coucou, Ceci est un test
...
9999 - coucou, Ceci est un test
10000 - coucou, Ceci est un test

Pour écluser le cas XTerm, que certaines légende place comme le plus rapide, il est certes léger en mémoire (voir graph plus loin) mais il est aussi définitivement le plus lent de tous.

Nous remarquons ensuite que les terminaux Gnome, XFCE et LX (ensemble d'outil censés être très légers) sont aussi lents les uns que les autres. Les résultats sont même tellement proche que cela confirme pour l'un et indique pour l'autre que tous fonctionnent sur les mêmes sources. Notons que pour ces tests, toutes les consoles utilisent la même police (Bitsrtream Vera Sans Mono - 10pt) avec l'anti-aliasing activé, une barre de défilement et un fond non transparent. Une sorte de minimum syndical. Et pour prévenir les questions, cela n'a rien changé en passant en police non vectorielle ou en virant la barre de défilement.

Deuxième constat, la vélocité de Konsole n'est pas un mythe. En revanche c'est aussi le plus gourmand en mémoire non partagé (obtenu par la commande pmem). Difficilement envisageable sur une petite machine, il est donc disqualifié.

Pour trouver des performances équivalente et une empreinte mémoire raisonnable, il faut se rabattre sur la famille des *xvt. Ici aussi, les résultats sont tellement proches de Konsole que c'est à se demander s'il n'y a pas là dessous le même code.

Maintenant la famille des *xvt souffre d'une tare assez problématique : l'absence de support de l'encodage UTF8, un peu gênant pour nos accents nationaux. Heureusement il y a une exception, urxvt (paquet rxvt-unicode) qui a été spécialement recodé pour permettre cet "exotisme". Exit donc les onglets car seul mrxvt en est capable, c'est un problème que l'on va gérer autrement.

urxvt est donc le bon candidat pour une console légère et véloce.

Paramétrage de urxvt

En standard cette console est à peu prés aussi sympathique qu'XTerm, autant dire pas très sexy (si tant est qu'une console puisse l'être). Mais avec un peu d'effort il est possible d'améliorer considérablement les choses. Pour cela vous devez modifier le le fichier ~/.Xdefaults de la manière suivante :

! Taille par défaut
URxvt*geometry: 74x27

! Police TTF
URxvt*font: xft:Bitstream Vera Sans Mono:style=Regular:pixelsize=13:antialias=true

! Taille du buffer et barre de défilement
URxvt*saveLines: 10000
URxvt*scrollBar: true
URxvt*scrollBar_right: true
URxvt*scrollColor: #c2dd5a
URxvt*scrollBar_floating: true
URxvt*scrollstyle: plain

! Curseur et nom du terminal
URxvt*cursorColor: white
URxvt*termName:xterm

! Couleurs (c'est la palette Tango)
URxvt*foreground: #f2f2f2
URxvt*background: #101010
URxvt*color0: #101010
URxvt*color1: #f13a21
URxvt*color2: #93f91d
URxvt*color3: #ffd00a
URxvt*color4: #004f9e
URxvt*color5: #ec0048
URxvt*color6: #2aa7e7
URxvt*color7: #f2f2f2
URxvt*color8: #1d202f
URxvt*color9: #ff361e
URxvt*color10: #ffc005
URxvt*color11: #93ff00
URxvt*color12: #0071ff
URxvt*color13: #ef0051
URxvt*color14: #4bb8fd
URxvt*color15: #a020f0

! Utilisation de la vraie transparence
urxvt*depth: 32
urxvt*background: rgba:0000/0000/0000/dddd

La petite surprise est qu'urxvt gère parfaitement la vraie transparence pour peu que le compositeur de fenêtre soit activé, et ce sans aucune perte de performance. Si vous n'avez pas de compositeur, il vous reste toujours la possibilité de vous rabattre sur la pseudo-transparence avec les paramètres transparent et fading (voir man urxvt pour plus de détails).

Ici nous avons un paramétrage utilisant la palette de couleur Tango, une transparence légère en mode compositeur (vous pouvez régler la couleur de teinte et le degré de transparence en faisant varier l'une des 4 composantes de couleur du paramètre background).

Enfin le paramètre saveline indique le nombre de lignes à garder en mémoire. Si la valeur de 10000 vous parait trop importante pour votre usage, réduisez là.

Pour ce qui est du copier-coller, on peut légitimement être déroutés par l'absence de menu contextuel. En réalité urxvt fonctionne comme n'importe quelle application X11 dans ce domaine. Sélectionner un texte le recopie dans le buffer primaire de X11 (le presse papier classique étant le buffer secondaire). Et pour le recopier il suffit de faire un click-central.

Maintenant si vous désirez un comportement plus "conventionnel", l'utilisation du presse papier (buffer secondaire) est réalisable par les combinaison de touche CTRL-INS pour copier et SHIFT-INS pour coller.

Enfin, côté sélection un double-click sur un mot le surligne et un triple-click surligne la ligne entière.

Se passer des onglets

L'autre manque tient à l'absence d'onglets et surtout de profiles. Lorsque l'on utilise massivement SSH pour se connecter sur une poignée de machines, personne n'a le goût de taper des commandes de connexion à tour de bras en début de chaque journée de boulot.

Alors il est bien sur possible de compter sur le gestionnaire de fenêtres avec un regroupement des uxrvt dans la barre de tâche ainsi qu'une série de menus de lancement dédiés, mais cette approche n'est pas très satisfaisante pour basculer rapidement d'une console à l'autre.

la "bonne" solution passe par l'utilisation d'un utilitaire vieux comme GNU, screen. Ce petit bijoux d'un autre temps permet d'empiler sur un même terminal, un nombre illimité de shells, et bien plus encore, jugez du peu :

  • Possibilité de créer une nouvelle "fenêtre" (en réalité il faut imaginer cela comme des onglets invisibles) par screen -t nom_fenêtre commande, soit par exemple screen -t mon_server ssh mon_serveur.
  • Possibilité de basculer sur fenêtre donnée dans la liste des fenêtres existantes par Ctrl-a puis la touche ". J'ai personnellement remplacé ce raccourcis par un double appui de Ctrl-a, plus pratique. Il suffit pour cela de rajouter dans le fichier ~/.screenrc la commande bind ^a windowlist -b.
  • Ajouter des profiles en passant par la définition de raccourcis clavier. Par exemple pour se connecter à "mon serveur" par un Ctrl-a puis Ctrl-S, il suffit d'ajouter à ~/.screenrc la ligne bind ^s screen -t mon_serveur ssh mon_serveur.
  • Plus fort, séparer l'écran en deux parties par Ctrl-A puis S. Vous pouvez ensuite basculer d'une partie à l'autre par Ctrl-a puis Tab et créer une nouvelle fenêtre dans la partie vierge par Ctrl-a puis c. Pour fermer une partie la combinaison Ctrl-a puis X, etc.
  • Détacher une fenêtre pour qu'elle reste active même lorsque l'on se déconnecte. Il est ainsi possible de se connecter sur un serveur, de lancer un processus long, de détache sa session, et de la rattacher le lendemain.
  • Possibilité de demander à screen de nous prévenir des changements apparus sur une fenêtre non active.
  • Prendre la main à distance sur une session screen.

Et pas mal d'autres choses encore que vous pouvez découvrir ici.

Conclusion

Avec urxvt et Screen, j'ai enfin une console efficace, rapide, bénéficiant d'une faible emprunte en mémoire, fonctionnant parfaitement sur une machine modeste et avec toutes les fonctions dont j'avais l'habitude avec Konsole et Gnome-Terminal.