Configurer Irssi et screen pour pouvoir changer d'encodage suivant le channel

Damien Pollet, 22 septembre 2003

Ce document est en cours de rédaction !

Vue d'ensemble de la situation

J'utilise un irssi lancé une bonne fois pour toutes sur ma passerelle chez moi. Il tourne dans un screen que je récupère via ssh depuis mon portable ou une machine du travail (ouf). La configuration expliquée ici s'applique à mon cas de figure mais devrait être trivialement adaptable.

Le principe de ce qui suit est d'utiliser UTF-8 le plus possible, puisqu'il permet de représenter tous les autres encodages (ou presque là mais on tombe dans la tétracapillotomie maladive). De plus ça fait un seul encodage à configurer une fois pour toutes, en espérant que tous les éléments de la chaîne le supportent. La bonne nouvelle est que c'est possible : la plupart des terminaux gèrent les entrées/sorties UTF-8, screen est transparent, et c'est irssi qui permet la traduction à la volée via un script d'extension.

La configuration

Le terminal

Il s'agit donc que le terminal envoie ce que l'on tape et interprète ce qu'il reçoit en UTF-8. Avec le Terminal.app de MacOS X c'est dans File > Show Info (panneau Display, en bas). J'entends déjà des remarques dans la salle, et de toute manière il y a trop d'émulateurs de terminaux différents, donc je laisse la chose en exercice au lecteur :-)

Screen

Commencer à se plonger dans la documentation de screen est plutôt dangereux. La bête est en effet bien plus puissante qu'elle n'apparaît au premier abord ; en fait screen peut avoir un encodage différent pour le terminal auquel il est rattaché et pour chacun des terminaux qu'il émule. Saupoudrez d'un peu de gestion à la termcap et vous aurez une idée du bor^H^Hazar. Fort heureusement on n'utilise à priori qu'un seul irssi à la fois, donc cette fonction de screen n'est pas réellement pertinente. On se contentera de passer screen en UTF-8 partout afin de le rendre transparent.

Pour cela, il suffit de passer à screen la commande suivante :

utf8 on on

Le raccourci C-a : permet d'accéder à l'invite de commandes de screen en direct sur un screen déjà lancé. Une solution pratique est d'ajouter les lignes

defutf8 on # nouvelles fenêtres en utf-8
utf8 on on # mode utf-8-aware dans les deux sens

dans ~/.screenrc.

L'option -U au lancement de screen est équivalente à la commande utf8 ; à noter qu'il est nécessaire de la donner même quand on rattache le screen (c.-à-d. screen -rU et pas seulement -r).

Pendant que j'y suis, j'ai aperçu dans la man de screen des commandes defencoding et encoding qui semblent être les versions plus générales de defutf8 et utf8 mais je n'ai pas cherché plus loin.

Irssi

Adaptation au terminal UTF-8

Il faut tout d'abord dire à irssi que son terminal est en UTF-8, sinon l'écho de ce qu'on tape sera affiché de travers :

/set term_type utf-8

Le script

C'est donc irssi qui fait tout le boulot d'encodage et d'interprétation (depuis et vers UTF-8, respectivement), grâce à un script d'extension en Perl. Irssi seul pourrait être passé en UTF-8, mais pour tous les channels, et sans traduction.

Le script en question est disponible sur le site d'irssi, ou dans une version modifiée à priori plus récente. C'est cette dernière que j'utilise, je n'ai pas testé la version « officielle ». Le script requiert un Perl 5.6.1 ou plus récent et le module iconv ; déposez le dans ~/.irssi/scripts/. Pour qu'il se charge automatiquement au lancement d'irssi, en mettre un lien symbolique dans ~/.irssi/scripts/autorun, sinon on peut toujours le charger à la main par /script load leScript.

Une fois chargé le script ajoute la commande /recode et reconnaît les variables recode_terminal_charset et recode_default_charset. La première donne l'encodage dans lequel sera traduit ce qui vient du réseau IRC, UTF-8 donc dans notre cas. La seconde précise l'encodage dans lequel interpréter ce qui vient du réseau, et vers lequel traduire ce qu'on y envoie. Dans notre cas (terminal en UTF-8, channels IRC français) les commandes pertinentes sont :

/set recode_terminal_charset utf-8
/set recode_default_charset iso-8859-15

La commande recode permet ensuite de spécifier un encodage spécifique pour un channel donné. L'aide disponible par /recode help se suffit à elle-même :

recode: /recode set [ircnet/]#channel charset
        /recode unset [ircnet/]#channel
        /recode info [ircnet/#channel] [ircnet/#channel ...]

Conclusion

Limitations

Le script recode-ion.pl semble ne pas traduire les arguments à des commandes d'irssi. La conséquence la plus gênante pour moi est que les accents dans les /msg s'affichent mal : il semble qu'ils soient envoyés correctement toutefois. C'est ennuyeux aussi pour les afficionados de figlet ou de cowsay.

Autres possibilités

J'ai envisagé d'utiliser un proxy IRC (un bouncer) à la place du couple screen-irssi. L'avantage d'un bouncer est qu'on peut utiliser n'importe quel client même graphique. Je n'ai pas encore essayé ce genre de configuration.

Références

Maintenant que vous avez lu tout ce document, je peux le dire : en fait il suffit de lire la FAQ d'irssi, il faut juste chercher « utf » et pas « charset ». Pour recode, on peut tomber là dessus via ceci qui donne le mode d'emploi au passage.