Artisan Numérique

/cli/terminal/urxvt/ Modifier la taille des polices d'urxvt

La taille des polices dans un terminal n'est généralement jamais la bonne. Tantôt il faut l'augmenter pour lire du code par exemple. Tantôt la réduire pour afficher un maximum de logs. Voici un petit plugin sans prétention pour UrXVT qui réalise ce travail.

Construction du plugin

Comme nous l'avons déjà vu lors de nos tentatives de redéfinition de palette, URxvt (mais pas que lui, cela fonctionne aussi avec Xterm ainsi que les terminaux basés sur libvte) est capable de modifier un paquet de chose à la volée en se basant sur les séquences OSC (Operating System Control).

Comme nous le montre Simon dans son papier il est déjà possible de modifier la police directement au sein du terminal à grand coup de commande echo.

Pour faire la même chose de manière plus intégrée, nous allons devoir réaliser un petit plugin à sauvegarder dans ~/.urxvt/perl/font-size (une suggestion hein :-) :

#!/usr/bin/perl
my %original_size = ();

sub on_start {
  my($term) = @_;
  if ($term->resource('font') =~ /size\=(\d+)/) {
    $original_size{$term->vt} = $1;
  }
}

sub on_user_command {
  my($term, $command) = @_;

  my $font = $term->resource('font');
  if ($font =~ /size\=(\d+)/) {
    my $new_size = my $current_size = $1;
    if ($command eq "font-increase") {
      $new_size++;
    } elsif ($command eq "font-decrease") {
      $new_size--;
    } elsif ($command eq "font-reset") {
      $new_size=$original_size{$term->vt};
    } else {
      return;
    }
    if ($new_size<6) {
      $new_size = 6;
    }
    $font =~ s/size\=$current_size/size\=$new_size/;
    $term->cmd_parse( "\033]710;$font\007");
  }
}
Plugin pour changer la taille de la police

Le principe est assez simple et reprend quelques un des concepts de plugin de gestion du focus. Tout d'abord on a une liste globale qui va mémoriser la taille de la police par terminal. La liste est surtout utile pour ceux qui utilisent UrXVT en mode démon (merci à Maethor pour m'avoir pointé ce bug).

Paramétrage

Ensuite nous avons un hook dont le but est de fournir des commandes qui pourront être rattachées à des raccourcis clavier via ~/.Xdefaults. Rien de surprenant ici, une commande pour zoomer d'un cran, dézoomer d'un cran et enfin une dernière pour remettre le terminal à son état initial. Cela nous donne dans ~/.Xdefault quelque chose comme ceci :

URxvt.perl-lib : /home/yoran/.urxvt/perl

URxvt.perl-ext-common: font-size

URxvt.keysym.M-plus: perl:font-increase
URxvt.keysym.M-minus: perl:font-decrease
URxvt.keysym.M-equal: perl:font-reset

perl-lib va nous permettre de déclarer un chemin pour nos plugins custom. Chemin qui va aller s'ajouter en interne à celui des scripts qui viennent avec le paquet. Ensuite perl-ext-common pour ajouter notre plugin. Si ce n'est pas votre coup d'essai il y a de fortes chances que vous en ayez d'autres de présent ici.

Viennent enfin les trois mappings, Alt + pour Zoomer, Alt - pour Dézoomer et enfin (merci à Hylobates de m'avoir fait débugger cela ;-) Alt = pour rétablir la taille d'origine.

Il ne reste plus qu'à sauver, éventuellement recherche ~/.Xdefaults avec un coup de xrdb -load ~/.Xdefaults puis de lancer un terminal pour juger du résultat.

Conclusion

Souvent on me demande l'avantage d'URxvt sur l'ensemble des terminaux existant, et machin-chose sait qu'il y en a un certain nombre. Déjà ils ne sont pas si nombreux car beaucoup sont des "coquilles" autours de libvte. Ensuite peu d'entre eux offrent une telle capacité à être littéralement programmé, ici avec du simple code Perl, tout en étant aussi rapide. Si vous voulez voir jusqu'où cela peut aller, je vous conseille d'aller jeter un oeil dans le dossier /usr/lib/urxvt/perl/, vous risquez d'être surpris :).

:t urxvt :t