Bureau Minimaliste - la console urxvt

Bureau Minimaliste - la console urxvt
Le 6 février, 2012 - 01:58 | Ulhume

Les application en mode texte ne sont pas une anecdote venant d'un lointain passé. Contrairement aux idées reçues, ces dernières ont évoluées pour coller aux usages d'aujourd'hui tout en restant plus stable, plus légères, plus spécialisées et plus configurables que leurs petites sœurs graphiques.

Mais pour que ces applications prennent leur pleine dimension, il leur faut un hébergement digne de ce nom, un terminal virtuel tout aussi rapide, léger, stable et efficace. Utilisé à peu prés partout, un tel terminal est un peu la pierre angulaire du bureau minimaliste.

: Nous allons donc voir comment paramétrer ce que je considère comme le plus performant des terminaux, rxvt-unicode aka urxvt.

Pourquoi urxvt ?

La question se pose légitimement car finalement rien ne ressemble plus à une console qu'une autre console, et quel bureau ne dispose pas aujourd'hui de son propre émulateur de terminal ? Et s'il s'agit pour vous juste de lancer quelques commandes de temps en temps, autant en effet se contenter de ce qui existe dans votre environnement.

En revanche, si vous comptez construire un bureau minimaliste pour utiliser des applications texte (vim, mutt, newsbeuter, irssi, etc.), l'efficacité de la console est aussi fondamentale que le processeur graphique pour un joueur (pour moi, tous les GPU se valent ;-).

Dans cette idée j'avais il y a (déjà) deux ans fait quelques tests pour objectiver l'efficacité des différents émulateurs de terminal. Les résultats avaient alors positionné loin devant urxvt comme l'émulateur présentant le meilleur rapport légèreté/performance/fonctionnalités :

  • L'affichage le plus rapide, même en scroll et sur des applications fortement colorisées.
  • Une empreinte mémoire très faible (comparée aux terminaux tels Gnome Terminal ou Konsole).
  • Ultra-stable. C'est bien simple, j'utilise urxvt pour le moins intensivement et en deux ans je n'ai jamais eu le moindre crash (ce qui est loin d'être le cas de Gnome Terminal ou Konsole).
  • Totalement paramétrable (gestion du clavier, couleurs, comportement, etc.)
  • Prise en charge des polices TTF.
  • Extensibilité par des greffons en Perl. Il en existe beaucoup à travers le net répondant à de nombreux besoins.
  • Prise en charge totale de l'encodage UTF8 (comme son nom l'indique ;-).

Autant de chose qui font pour moi d'urxvt, le meilleur terminal, et de loin.

Installation

Par les paquets

Il y a de très fortes chances qu'urxvt fasse partie des paquets standards de n'importe quelle distribution. Pour la deb, le paquet s'appelle rxvt-unicode et s'installe donc par :

##apt-get install rxvt-unicode
installation d'urxvt

Par les sources

Ce que j'apprécie le plus avec mon bureau minimaliste consiste en la simplicité et la rapidité de compilation de ses applications. Je n'ai jamais à attendre les paquets pour disposer des dernières versions, du patch "qui va bien" ou même de modifier le code (généralement du C de base relativement lisible).

Pour compiler urxvt, il nous faudra soit un tarball des dernières sources, soit la récupération d'un copie du dépôt CVS. Une fois les sources récupérées, un ./configure --help nous donne la liste des options possibles. Vous pouvez aussi modifier le fichier src/features.h qui contient une liste d'option statiques à commenter/décommenter.

Pour ma part, j'utilise les options suivantes :

gaston$cd rxvt-unicode
gaston$./configure --prefix=/usr --disable-codsets --disable-pixbuf --disable-transparency --disable-fading --disable-next-scroll --disable-xterm-scroll --disable-rxvt-scroll --disable-swapscreen --disable-iso14755 --enable-256-color
gaston$make -j 4
gaston$sudo make install
Compilation d'urxvt

Et c'est tout, avec cela vous disposez d'une console fonctionnelle en 256 couleurs. J'y ai désactivé la gestion de la transparence car j'aime bien mes yeux, et les scrollbars car je ne les utilise pas. A vous de faire votre mouture.

Terminfo

Sous ce nom un peu étrange réside un concept qui remonte à la nuit du temps UNIX (qui commence le 1 Janvier 1970, rappelons le ;-). A cette époque, les terminaux étaient physiques. Une configuration "classique", dite "centralisée", consistait en un serveur unique duquel partait un faisceau de liaisons série (remplacé plus tard par les LAN), des postes de travail dont la seule intelligence était d'interpréter les ordres du serveur pour l'affichage et encoder en retour ce qui était tapé au clavier. Si vous y réfléchissez un peu, vous verrez là le cocasse du "modernisme" des applications web. Car finalement qu'est-ce qu'une application web si ce n'est un vieux système centralisé avec un terminal moderne appelé "navigateur"...

Bien évidemment, même si des standards ce sont imposés dans leur manière d'échanger avec le serveur (vt100, ANSI, etc), chaque terminal avait ses propres exotismes de causerie. Ainsi sont nés les termcap (TERMinal CAPabilities) qui ne sont rien d'autre que des fichiers permettant au serveur de savoir qu'envoyer pour effacer l'écran distant ou encore comprendre que telle séquence de code correspond à la touche Flèche Haut. Les termcaps, qui sont à un moment devenus des terminfo, forment donc une base de données des capacités de chaque terminal. Et les consoles virtuelles, comme urxvt, n'échappent pas à la règle.

Lorsqu'une application console se lance, et qu'elle est codée proprement, la première chose qu'elle fait est récupérer le terminfo qui va bien en fonction de la console utilisée. Pour cela elle s'aide de la variable d'environnement $TERM qui contient toujours la référence du terminal dans la base terminfo. Pour les terminaux physiques il fallait obligatoirement mettre la bonne valeur à cette variable dans sont ~/.bashrc. Les terminaux virtuels règlent généralement eux-mêmes cette variable au mieux de leurs capacités.

Ainsi lorsque vous lancez urxvt, et que vous tapez la commande echo $TERM, vous devez obtenir quelque chose comme rxvt-unicode ou encore rxvt-unicode-256color. Si vous obtenez autre chose, comme xterm ce n'est pas très bon car les codes ne sont pas les mêmes entre ces deux terminaux. Vérifiez alors que vous n'avez pas une ressource URxvt.termName qui traine dans votre ~/.Xdefault. Si oui, enlevez la et relancez urxvt pour voir ce que cela donne.

Ceci fait, vous pouvez obtenir la liste des capacité du terminal par la commande infocmp.

gaston$echo $TERM
rxvt-unicode-256color
gaston$infocmp
# Reconstructed via infocmp from file: /usr/share/terminfo/r/rxvt-unicode-256color
rxvt-unicode-256color|rxvt-unicode terminal with 256 colors (X Window System),
am, bce, bw, ccc, eo, hs, km, mc5i, mir, msgr, npc, xenl, xon,
btns#5, colors#256, cols#80, it#8, lines#24, lm#0, ncv#0,
pairs#32767,
(...)
kf10=\\E[21~, kf11=\\E[23~, kf12=\\E[24~, kf13=\\E[25~,
(...)
acsc=+C\\,D-A.B0E``aaffgghFiGjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{}~~,
bel=^G, blink=\\E[5m, bold=\\E[1m, civis=\\E[?25l,
sgr=\\E[0%?%p6%t;1%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p4%t;5%;%?%p7%t;8%;m%?%p9%t\\E(0%e\\E(B%;,
sgr0=\\E[m\\E(B, sitm=\\E[3m, smacs=\\E(0, smam=\\E[?7h,
smcup=\\E[?1049h, smir=\\E[4h, smkx=\\E=, smso=\\E[7m,
smul=\\E[4m, tbc=\\E[3g, tsl=\\E]2;, u6=\\E[%i%d;%dR, u7=\\E[6n,
u8=\\E[?1;2c, u9=\\E[c, vpa=\\E[%i%p1%dd,
capacités du terminal urxvt patché pour les 256 couleurs

Ici nous voyons par exemple que le termcap est en 256 couleurs (logique si on a $TERM=rxvt-unicode-256color), que pour mettre en gras, il faut que le serveur envoie la commande \\E[1m et que la touche F10 correspond au code \\E[21m

Alors à quoi cela sert de savoir tout cela me direz-vous ? Et bien tout simplement à arrêter de faire n'importe quoi comme je le vois sur 99% des tutos sur le net traitant du thème "comment faire marcher ma touche Home" (un exemple). Avant d'aller taper dans la définition des touches du terminal (voir plus loin), de hacker inputrc, ou que sais-je, commencez par vérifier 1/ que votre variable $TERM représente bien le terminal que vous utiliser, 2/ que la commande infocmp renvoie bien un résultat 3/ que l'application qui pose problème (ex. VIM) prend bien en compte $TERM et les codes donnés par infocmp. Après seulement il sera temps d'aller chercher ailleurs..

Pour vim, vous pouvez valider le dernier point en utilisent les commandes :set term et :set termcap

Les ressources de X

Pour son paramétrage, urxvt utilise le fichier de ressource X. Ce fichier se trouve dans votre dossier (à créer s'il n'existe pas encore) sous le nom ~/.Xdefaults ou ~/.Xresources (le premier nom est semble y il déprécié en faveur du second, mais les deux fonctionnent).

A l'origine toutes les applications X utilisaient ce fichier pour y puiser leur paramétrage. Aujourd'hui son usage est bien plus restreint et permet essentiellement de gérer l'économiseur d'écran (xscreensaver), le thème du curseur, les réglages de police de caractère (dpi, antialiasing, hinting, etc.) et les applications qui le respecte encore telles qu'urxvt.

Pour comprendre la suite il est nécessaire de s'arrêter sur les notions de classes et de nom des applications X. Une classe est une valeur définissant le type d'application, ou le type de contrôle (bouton, menu, etc) au sein de l'application. Généralement une classe commence par une majuscule. Par exemple la classe d'IceWeasel est IceWeasel.

Le nom (ou instance) est lui spécifique à l'application. Le nom d'Iceweasel est ainsi en réalité Navigator (Une trace du lointain héritage de FireFox, petit fiston du célèbre Netscape Navigator). Pour urxvt, la classe de l'application est URxvt (notez les deux majuscules) et son nom est urxvt (tout en minuscules).

Petite astuce, un moyen simple de connaître la classe et l'instance de n'importe quelle application est donné par la commande xprop. Lancez-la dans une console et le curseur de la souris se transforme en croix vous permettant de pointer une application. La commande affiche alors un tas d'information dont une ligne WM_CLASS indiquant en première valeur l'instance, et en seconde la classe.

Ces deux notions vont nous servir à remplir notre fichier ~/.Xdefaults avec des lignes de la forme :

nomAppli.ClasseAppli.(..).ClasseMonWidget.ressourceX=valeurY
Définition d'une ressource

Cela se lit : donne la valeur "Y" à la ressource "X" du contrôle de classe "MonWidget", bla bla, contenu dans l'application de classe "Appli" et de nom "appli".

Dans la pratique, il sera bien rare d'avoir à utiliser la classe des contrôles. Cela se simplifiera donc sous la forme :

nomAppli.ClasseAppli.ressourceX=valeurY

Pour simplifier encore, il est possible d'omettre le nom, le ressource portera donc sur toutes les applications d'une même classe mais vu que cette classe est généralement unique par application, le risque est limité. De même il est possible de ne mettre que le nom et d'omettre la classe. Enfin vous pouvez aussi utiliser le séparateur * à la place de .. A*B signifie "quel que soit le chemin entre A et B". Cela remplacera donc aussi bien A.E.B que A.F.B.

En résumé, pour l'application urxvt, urxvt.x, URxvt.x, urxvt*x et URxvt*x auront le même résultat.

Dernières petites précisions sur le fichier ~/.Xdefaults, les commentaires s'y notent par un ! en début de ligne. Enfin il est possible d'être propre et organisé en découpant ce fichier en plusieurs petits fichier que l'on appellera par la commande #include "chemin/vers/fichier".

Exemple d'organisation, créer un dossier ~/.xdefaults et y mettre un main.rc. Puis dans le fichier ~/.Xdefaults on ne mettra que :

#include ".xdefaults/main.rc"
un Xdefault générique

Ainsi tout sera rangé au même endroit et vous pourrez dans main.rc inclure d'autres fichiers (ex. color.rc, urxvt.rc, etc.).

Apparence du terminal

Police et position

Passons maintenant à la pratique en commençant par fixer la taille par défaut de la console. Cette possibilité est offerte par la ressource geometry=largeurxhauteur+/-positionX+/-positionY qui est présente pour beaucoup d'application X. Mais c'est plus un usage qu'une norme à part entière. Ainsi pour urxvt, largeur et hauteur ne sont pas exprimées en pixels, mais en caractères (ce qui est assez logique vu l'usage). En revanche la position (optionnelle) est elle fixée en pixel. Le + et le - indiquent des positions relatives aux bords gauche ou droit (ou haut et bas pour la position Y) de l'écran.

URxvt.geometry: 74x27
Définition de la géométrie du terminal

Ici nous ne définissons pas de position, juste la taille d'un nouveau terminal (74 caractères de large sur 27 de haut). Mais pour que cela ait du sens, il faut aussi définir les polices utilisées.

URxvt.font: xft:DejaVu Sans Mono:size=10
URxvt.boldFont: xft:DejaVu Sans Mono:size=10
Définition des polices du terminal
ec

Nous utilisons une police TrueType DejaVu. J'en ai testé énormément (j'en ai même acheté) mais cela reste pour moi celle qui allie le mieux compacité et lisibilité. Mais il s'agit là d'un point de vue que je ne défendrais pas. Faites vos tests et utilisez celle qui vous convient le mieux, le choix ne manque pas (Terminus, consolas, monaco, inconsolas, oloron program, etc.).

Barres de défilement

Urxvt offre de nombreuses option permettant de spécifier le type de barre qui vous convient. Personnellement j'aime bien l'option "pas de barre", je n'en vois en effet pas vraiment l'intérêt. Mais pour ceux qui y tiennent cela donne quelque chose comme cela :

URxvt*saveLines: 10000
URxvt*scrollBar: true
URxvt*scrollBar_right: true
URxvt*scrollColor: #c2dd5a
URxvt*scrollBar_floating: true
URxvt*scrollstyle: plain
Configuration de la barre de défilement

Le point intéressant ici, outre l'esthétique, est le nombre de lignes qu'urxvt va sauvegarder dans son historique (ici, 10000). Adaptez cette valeur à votre usage pour ne pas dépenser exagérément les ressources. Une telle valeur est utile pour un terminal qui afficherait des traces, beaucoup moins pour celui utilisé avec mutt ou encore irssi qui utilise son propre buffer.

Enfin, notez que pour se balader dans l'historique, vous pouvez soit utiliser la roulette, soit simplement le clavier par Ctrl-PageUp et Ctrl-PageDown. De même vous pouvez chercher dans l'historique par la combinaison Alt-S (vous pouvez changer cela par la ressource searchable-scrollback).

Fond et transparence

Commençons par la base utile, définir le fond et la couleur du texte de la console. L'un et l'autre sont des couleurs par défaut. Elle sont utilisée si l'application ne spécifie rien qui les contredise. À ne pas confondre donc avec les couleurs que nous allons voir plus loin.

Urxvt utilise entre autre la même notation que le web pour les couleurs, cela nous donne :

URxvt*foreground: #f2f2f2
URxvt*background: #101010
Définition des couleurs du fond et du texte par défaut

Voilà, simple et sobre. Et me concernant c'est largement suffisant. Maintenant certains préfèrent des fonds "transparents" qui laisse apparaître leur beau bureau... Question de point de vue au sens propre, moi je tiens avant tout à mes yeux et la lisibilité est pour moi le point essentiel.

Cependant si vous y tenez, urxvt gère deux types de transparence. Tout d'abord la fausse qui fonctionne tout le temps et consiste à simplement recopier le papier peint du bureau ou une image que vous spécifiez (reportez vous à man urxvt pour cela).

URxvt.inheritPixmap: true
URxvt.tintColor: #FF0000
!URxvt.shading:50
Utilisation d'une fausse transparence

Avec le premier réglage, le principe est d'utiliser le fond du bureau comme fond d'écran de la console. Utilisé seul, ce fond est simplement recopié à chaque déplacement/redimensionnement du terminal. Le second réglage permet de coloriser le fond. Dans le cas présent, j'applique un vilain rouge bien gore. Notez que l'intensité de la couleur agit comme modificateur du niveau de transparence (ex. #800000 donnera un fond peu transparent rouge). Enfin le dernier paramètre agit uniquement sur la transparence (100 pour totalement transparent et 0 pour totalement opaque). Il vaut cependant mieux choisir votre camp au nom de la performance. Soit vous utilisez le shading, soit le tintColor, mais évitez d'utiliser les deux, même si ça fonctionne.

L'autre transparence disponible (la vraie) est réservée à ceux qui utilise un compositeur de fenêtre.

URxvt.depth: 32
URxvt.background: rgba:0000/0000/0000/dddd
Utilisation de la vraie transparence

Dans ce cas nous indiquons à urxvt d'utiliser une profondeur de pixel de 32bits (24 bits pour stocker les composantes RGB et 8 de plus pour la transparence) et nous indiquons un fond noir (le triplet de 0000) assorti d'une transparence (dd, la transparence allant de 0 à ff).

Si vous souhaitez utiliser un compositeur de fenêtres léger vous pouvez essayer Cairo Composite Manager.

Gestion des couleurs

Mode 8/16 couleurs

Sorti des valeurs par défaut, urxvt dispose de 3 modèles de couleur : 8/16, 88 et 256 couleurs. Pour commencer par le premier mode, il s'agit en réalité du mode classique en 8 couleurs doublé d'une triche pour l'augmenter à 16 couleurs.

En effet la séquence permettant de choisir couleur de texte et fond est respectivement de la forme ^[[3xm et ^[[4xm. x représente ici une valeur sur 1 digit allant de 0 à 7 (index de la couleur) ou 9 (retour à la couleur par défaut). En somme nous sommes un peu limité de l'indexation... Il y a bien le 8 de libre mais c'est un peu "faible" comme extension ;-).

L'astuce pour passer à 16 couleurs consiste à revoir l'interprétation de l'attribut 'gras' (de séquence ANSI ^[[1m). Cet attribut indique normalement au terminal que le caractère qui suit est gras, mais indique aussi qu'il est en surbrillance. Le terminal va donc jouer sur cette ambigüité pour utiliser 8 autres couleurs "surbrillantes". Ainsi le "rouge" devient "rouge brillant", ce qui n'aurait que peut d'intérêt si les terminaux ne permettaient pas en outre de redéfinir les 16 couleurs de sorte à ce que ce "rouge brillant" soit finalement "vert pomme"... Ce qui nous donne pour une version Tango de la palette:

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
Paramétrage de la palette de couleurs

On dispose ainsi bien de 16 couleurs distinctes... Mais ce n'est pas sans "quelques" problèmes :

  1. Le mode gras/brillant n'existant pas pour le fond, les 8 couleurs "gagnées" ne sont accessibles que pour le texte (un fond gras, ça n'a pas de sens...).
  2. Les applications qui s'attendent réellement à avoir un "rouge brillant" font une sale tête (au sens littéral du terme) lorsqu'on leur colle un "vert pomme" à la place...
  3. Corolaire du point précédent, si vous configurez une application pour afficher telle chose en vert pomme, cela risque d'être plutôt vilain vu d'un autre terminal pour qui le vert pomme est toujours "rouge brillant".
  4. Enfin, cerise sur le terminal, ce dernier ne sachant trop quoi choisir entre "gras" et "brillant", prennent souvent l'option la plus exhaustive. On arrive donc à un vert-pomme-gras du plus bel effet ;-).

Pour régler le dernière problème avec urxvt, la "solution" consiste à désactiver soit la gestion de styles (à la compilation), soit assigner une police non-grasse en tant que police à utilise pour le gras. Cela se fait dans ~/.Xdefaults via la ressource URxvt.boldFont (attention à la casse !). De même vous pouvez redéfinir l'affichage des italiques et des gras/italiques respectivement par italicFont et boldItalicFont.

! Police de base, ni grasse, ni italic
URxvt.font: xft:DejaVu Sans Mono:size=10

! Sa version grasse qui ne l'est pas
URxvt.boldFont: xft:DejaVu Sans Mono:size=10

! Sa version grasse-italic qui n'
est qu'italique
URxvt.boldItalicFont: xft:DejaVu Sans Mono:italic:size=10
Suppression des gras

Pas très satisfaisant ceci dit car nous avons ainsi perdu la capacité de faire du gras et gardé les autres problèmes intactes. Passons donc à la vitesse au dessus.

Mode 88/256 Couleurs

Depuis un certain temps déjà xterm et urxvt proposent un mode plus évolué que la glutte qui précède. Comme nous l'avons vu, la couleur du texte s'écrit en ANSI ^[[3xm (ou ^[[4xm pour le fond). Et si vous vous souvenez bien, nous avons juste la valeur x=8 de libre. C'est la brèche utilisée à l'origine par xterm pour ajouter 256 couleurs... Comment ? Simplement en définissant les valeurs 38 et 48 comme début de séquence permettant d'accéder aux 256 valeurs. L'avantage est que ces valeurs aliens seront ignorées par les anciens terminaux et cela permet ainsi d'étendre la norme ANSI sans la corrompre.

Ainsi une encre en mode 256 couleurs s'écrit ^[[38;5;y (remplacer 38 par 48 pour un fond). La partie 5 est là pour éviter les erreurs d'interprétation (5 voulant dire "clignotant", il est rarement utilisé). La valeur y quant à elle peut aller de 0 à 255 :

  • De 0 à 15 - Ce sont strictement les mêmes couleurs que la palette initiale, c'est à dire celle définie par les ressources colorX : #RRGGBB utilisées plus haut pour la palette tango. Ainsi ^[[30m a la même signification que ^[[38;5;0
  • De 16 à 231 : un cube de 6x6x6=216 couleurs. Ces couleurs sont définies par le terminal et ne peuvent être changée (il me semble que c'est faisable avec urxvt par une séquence ANSI).
  • de 232 à 255 : 24 niveaux de gris.

Urxvt en mode 88 couleurs reprend strictement le même principe mais avec un cube de 4x4x4 couleurs et 8 niveaux de gros. Maintenant lorsque vous compilez vous-même urxvt avec l'option --enable-256-color vous aurez exactement les mêmes couleurs qu'xterm.

Maintenant les avantages du mode 256 couleurs sont avant tout qu'ils règlent les problèmes du mode 16 couleurs :

  • Le fond et l'encre sont choisies parmi les mêmes couleurs.
  • Le gras peut être utilisé ou pas sur l'importe quelle couleur.
  • La palette étendue est suffisamment vaste pour ne plus avoir à redéfinir les 16 couleurs de base.

Mapping du clavier

Dans une console, chaque appui de touche correspond à une séquence de codes émises par le terminal qui sera interprétée par le logiciel. Ces séquences sont spécifique à la norme émulée par le terminal (ANSI, VT100, etc) mais aussi à chaque émulateur de terminal qui va rajouter ses propres exotisme.

Normalement les caractéristiques d'un terminal sont consignés dans un fichier appelé termcap. C'est ce fichier qui est lu par l'application qui saura alors à quoi correspond quelle séquence. Pour savoir quel termcap lire, l'application se base sur la variable d'environnement TERM. Ainsi si cette variable contient xterm (ce qui est la valeur par défaut si vous ouvre un shell sous xterm), l'application (par exemple mutt) car aller chercher le termcap correspondant et du coup comprendre que si xterm lui envoie le code ^[[A, cela veut dire "flèche vers le haut".

Le ^[ correspond au code ascii 27 (aka Control-[ aka Control-Esc) et non à deux caractères.

Ça c'est dans le meilleur des mondes. Dans la vraie vie, le termcap n'est jamais correctement renseigné, ou mieux, il n'existe pas (c'est plus ou moins le cas pour urxvt). Du coup l'application ne sait que penser des touches spéciales tapées et votre terminal se rempli rapidement de codes ésotériques. C'est typiquement le cas des touches Ctrl-Shift-Fléches.

Une manière très pratique de connaître les séquences générées par un terminal est de lancer ce terminal et de taper la commande cat -v. Tapez ensuite les touches que vous souhaiter documenter, leur séquence doit apparaître en clair.

Pour ajouter ce mapping à URXVT :

URxvt.keysym.S-Up: \\033[1;2A
URxvt.keysym.S-Down: \\033[1;2B
URxvt.keysym.S-Right: \\033[1;2C
URxvt.keysym.S-Left: \\033[1;2D
URxvt.keysym.S-Home: \\033[1;2H
URxvt.keysym.S-End: \\033[1;2F
URxvt.keysym.C-Up: \\033[1;5A
URxvt.keysym.C-Down: \\033[1;5B
URxvt.keysym.C-Right: \\033[1;5C
URxvt.keysym.C-Left: \\033[1;5D
URxvt.keysym.C-S-Up: \\033[1;6A
URxvt.keysym.C-S-Down: \\033[1;6B
URxvt.keysym.C-S-Right: \\033[1;6C
URXvt.keysym.C-S-Left: \\033[1;6D
Génération des séquences de touche

Seul souci, le Control-Shift est déjà pris par urxvt pour gérer l'encodage "manuel" des caractères unicode (standard ISO 14755). La solution consiste à désactiver cette fonctionnalité qui ne me sert pas tous les jours:

URxvt.iso14755: false
URxvt.iso14755_52: false
Désactivation du mode ISO14755

Gestion de la souris

De manière externe, la prise en charge de la souris par urxvt est minimaliste et se limite à la roulette pour accéder à l'historique, au double-click pour sélectionner un mot et au triple-click pour la ligne complète.

Mais en interne, urxvt génère pour les application qu'elle héberge des séquences identiques à ce que nous avons vu pour le clavier. Cela inclue la position du curseur, les boutons, la roulette (qui n'est rien d'autre que deux boutons supplémentaires) mais aussi le drag. Cette dernière possibilité est très pratique, lorsque l'application sait le gérer.

C'est par exemple le cas de VIM si vous ajoutez à votre .vimrc la commande set mouse=a (a voulant dire que la souris est utilisé dans tous les cas, :help mouse pour plus d'info sur les possibilités).

Maintenant, le fait d'activer la gestion de la souris dans VIM permet de faire pas mal de chose mais pas forcement tout. Pour aller plus loin il faut définir dans VIM le mode de gestion de la souris commandé par la variable ttymouse. Pour savoir dans quel mode vous êtes par défaut, faite un set ttymouse. Chez moi cela renvoie xterm2 qui est déjà un bon niveau de support. Mais si votre version de VIM le prend en charge, il existe un niveau encore plus efficace permettant tout ce que la version graphique de VIM permet (scroll, sélection, redimensionnement de fenêtres, etc). Ce mode est atteint par :set ttymouse=urxvt). Si cela génère une erreur, c'est que votre VIM n'est pas assez récent, le mieux est donc de compiler le votre à partir des sources.

Une fois VIM en mode "urxvt", c'est superbement fluide à un tel point que cette option comble à elle seule l'espace entre un VIM dans une console, et un gVim (la version graphique de VIM). Le seul détail qui manque est le changement de forme du curseur lorsqu'il survole des zones déplaçable. Je pense qu'on va survivre ;-)

Si vous maintenez la touche Shift pressée, Urxvt va garder les évènements souris pour lui sans les transmettre à l'application hébergée. Cela permet notamment d'utiliser le presse-papier primaire même au sein d'application gérant la souris et donc ses propres sélections.

Extension par script

Gestion des URL

Une chose importante dans une console moderne est de pouvoir rapidement afficher une URL sur le navigateur par défaut. Pour cela il faut activer les extensions perl et utiliser le greffon matcher fourni en standard.

URxvt.perl-ext-common: default,matcher
Activation des extensions Perl

Une fois le terminal relancé, les urls doivent être automatiquement soulignées et clickables. Cependant, je suis un grand fan de pentadactyl et de son système de numérotation des liens. Et par chance Sterling Camden aime aussi et a créé pour urxvt un greffon produisant le même résultat. Pour utiliser cela à la place de matcher, il suffit de télécharger l'archive et de recopie url-picker dans un dossier (à créer) ~/.urxvt/kbd. Ce dossier nous servira par la suite à stoquer toutes les extensions Perl "custom".

URxvt.perl-lib : .urxvt/perl
URxvt.perl-ext-common: default,url-picker
URxvt.keysym.C-f: perl:url-picker
Ajout d'une extension Perl custom

Outre la déclaration du greffon, nous avons assigné à la combinaison de touche Control-F l'action d'affichage des liens numérotés. Un redémarrage de la console et vous pouvez tester. Ceci fait, affichez un texte contenant plusieurs URL, puis pressez Control-F. Une série de numéros doivent apparaître au début de chaque URL présente sur l'écran. Tapez maintenant le numéro d'une URL, elle s'ouvrir dans le navigateur par défaut.

Les onglets

Là aussi, j'aborde ce point par souci d'exhaustivité car, exception faite du navigateur, je ne suis pas un grand fan d'onglets. Comme les scrollbars, les menus déroulants et les barres d'outils, j'ai même tendances à les faire disparaître dés que je le peux.

D'un point de vue graphique, urxvt ne gère pas les onglets. Maintenant il y a trois solutions possible pour disposer de cette fonctionnalité :

  • Passer par le greffon standard tabbed. Vous disposerez ainsi d'onglets en mode texte avec une série de raccourcis pour les gérer (Shift-bas pour un nouvel onglet, Shift-Gauche|Droite pour se balader, Ctrl-D pour supprimer l'onglet courant).
  • Passer par GNU screen ou tmux.
  • Utiliser un gestionnaire de fenêtre permettant les onglets comme i3.

Gestion du presse-papier

Comme vous le savez sans doute, X dispose de deux presse-papiers. Celui d'origine (aka primaire) qui est déclenché dés que vous faites une sélection de texte dans n'importe quelle application. Pour coller, il suffit alors de se positionner sur la cible et de faire un click-central. Ensuite vous avez le presse-papier "classique" par Ctrl-C/Ctrl-V. Urxvt fonctionne très bien avec le presse-papier primaire mais n'implémente rien pour récupérer les données du presse-papier "bureau".

Il est possible de se passer de click-central (et donc de la souris) en utilisant pour coller la combinaison de touche Shift-Ins. Pratique pour les portables qui n'ont pas de bouton central.

Pour régler cela, deux solutions. Soit vous maintenez les deux presse-papier synchrone en utilisant un outil comme parcellite, ou plus simplement autocutsel (voir mon précédent article pour cette approche).

L'autre option consiste à implémenter le presse-papier bureau sur urxvt par le biais d'un autre greffon appelé en toute originalité clipboard que vous placerez dans le dossier ~/.urxvt/perl assorti du paramétrage suivante :

URxvt.perl-ext-common: default,url-picker,clipboard
URxvt.keysym.C-S-c: perl:clipboard:copy
URxvt.keysym.C-S-v: perl:clipboard:paste
Ajout du greffon pour la gestion du presse-papier

Le paramétrage est assez facile à comprendre et le presse-papier est disponible après avoir relancé urxvt via les touches Control-Shift-V et Control-Shift-C.

Configuration par application

Tout ceci est bien sympathique mais que faire lorsque l'on a besoin qu'urxvt se comporte différemment pour une application donnée. Par exemple pour lui fournir un mapping de clavier ou des couleurs spécifiques à elle seule.

La solution à ce problème réside dans .Xdefaults et sa fameuse syntaxe nom.classe.ressource=valeur. Il est en effet tout à fait possible pour la majorité des applications X de modifier soit le nom de l'application, soit la classe, soit les deux. Par exemple pour une application GTK, il suffit d'ajouter les paramètres --class=maClasse et/ou --name=monNom. Il en va de même pour urxvt que l'on peut ainsi travestir.

Pour illustrer le propos, imaginons qu'une combinaison de touche affiche un terminal contenant alsamixer mais que nous devions modifier les couleurs de ce terminal pour rendre la légende de l'application lisible. Un tel terminal sera lancé de la manière suivante :

gaston$urxvt -name alsa -title audio -e alsamixer
Lancement d'un terminal nommé

Le paramètre -name va avoir pour incidence d'écraser le nom d'origine de l'application qui ne sera donc plus urxvt, mais alsa. -title donne un titre au terminal et -e indique la commande à exécuter, ici alsamixer. Si vous utilisez xprop pour tester cette nouvelle fenêtre, vous constaterez bien que son nom est alsa mais que sa classe est restée URxvt.

Dans la mesure où nous avons jusqu'à maintenant défini uniquement des ressources pour la classe URxvt, elle fonctionneront aussi pour ce terminal. Reste donc à ajouter des règles qui sont spécifique au nom alsa :

! on donne une position et une taille spécifique à ce terminal
alsa.geometry: 100x20+50+40

! et on altère une couleur qui n'est pas lisible sinon
alsa.color4: #653415
paramétrage d'un terminal nommé

L'autre avantage de cette approche et qu'elle permet à un gestionnaire de fenêtre évolué (ex. awesome, i3, wmfs, etc.) d'appliquer des règles pour ce nom particulier (ex. rendre la fenêtre flottante).

urxvt en mode démon

Urxvt est encore trop lent à se lancer ou trop lourd en ressources à votre goût ? Pas de problème, il suffit d'utiliser le démon urxvtd qui gérera sous un même processus l'ensemble des terminaux ouverts.

Le démon se lance très simplement, de préférence dans votre fichier ~/.xinitrc de la manière suivante

urxvtd -o -f -q
Lancement du démon uxrvtd

Le -o indique que le démon doit se caler sur l'affichage X en cours, ce qui lui permet de mourir en toute simplicité lorsque X est arrêté. -f passe le démon en arrière plan et -q lui dit d'être sobre en paroles.

Lorsque le démon est en route, son usage est vraiment très très complexe. Il faut en effet penser à ne plus lancer urxvt, mais urxvtc. Tout le reste est strictement identique (paramétrage, options en ligne de commande, etc).

Une fois le démon en route, la différence est très perceptible sur des outils "lourds" (tout est relatif ;-) comme vim. Le démarrage est simplement instantané.

Conclusion

Nous n'avons abordé ici qu'une infime partie des paramétrages disponibles pour urxvt. La connaissance peut cependant être facilement étendue en consultant le man du terminal. En attendant, j'espère vous avoir fait apprécier ce terminal qui fait partie intégrante de mon quotidien.

Vus : 1410
Publié par Artisan Numérique : 100