Un jour j'en ai eu marre d' Irssi.

  • Irssi est le choix par défaut des utilisateurs Linux pour IRC.
  • Il faut dire que la concurrence n'est (n'était) pas brillante,
  • Pourtant, on ne peut pas dire que Irssi soit le parangon du client IRC.


Irssi la branche sur laquelle il est assis
  • Irssi présente de nombreux défauts, ou tout du moins de sérieuses limitations:
    • son horrible fichier de configuration (colorer différement la barre de stats du buffer actif fut un vrai défi).
    • un scripting limité à Perl.
    • une ergonomie discutable (la configuration par défaut est inutilisable).
    • une documentation incomplète et incompréhensible.


C'est vrai, il y a d'autres clients IRC
  • BitchX : ha-ha-ha, je vous laisse essayer (il y en a qui aiment…).
  • XChat : qu'il est de bon ton de dénigrer, mais qui a le mérite d'être simple. On en fait vite le tour, cependant.


Voici WeeChat
  • Certe, je débarque: ce logiciel existe depuis un certain temps.
    • 2005 pour les premières versions exploitables.
  • Il est cependant toujours développé, et comprend de nombreux avantages par rapport à Irssi.
    • Une doc claire et complète, et en français qui plus est.
    • Une configuration aisée. Toutes les modifications sont applicables sans relancer WeeChat, et peuvent être sauvées depuis celui-ci.
    • Une prise en main rapide.
    • Scripting avec Lua! Yäh ! Ftaghn Cthulhu Lua ! Et pour le reste d'entre-vous, il y a aussi la possibilité de scripter en Python, en Perl, en Ruby ou en TCL.
    • Possibilité d'utiliser un client différent du client ncurses proposé par défaut (pour ceux qui ont honte d'installer XChat).



Premier contact avec WeeChat


Comment qu'ça s'installe ?
  • Boudiou: pacman -S weechat
    • Ne vous laissez pas impressionner par le numéro de version (en ce moment: 0.3.6).
    • C'est du vrai logiciel libre pleinement fonctionnel, et qui ne cherche pas à en mettre plein la vue avec une numérotation stratosphérique des versions.


Déroulement d'une session typique
  • Quelques commandes de base devraient vous sortir d'affaire, sans rien avoir à configurer pour commencer.
  • Commençons par lancer WeeChat:
    • weechat-curses
  • /connect irc.freenode.org : c'est une connexion temporaire, nous verrons plus loin comment la rendre permanente.
  • /join archlinux-fr : notez la barre des nicks sur le côté. C'est bien, mais ça prend de la place. Mais comme c'est un élément d'interface, c'est désactivable.
  • À ce stade, il peut être utile de savoir comment se déplacer dans les fenêtres: ALT + flèches curseur
  • Par défaut, une fenêtre affiche un seul buffer. Par la suite, vous pourrez afficher plusieurs buffers dans une fenêtre avec les commandes split.
    • /window splith : splitte horizontalement.
    • /window splitv : coupe verticalement.
    • Utilisez F7 et F8 pour naviguer dans les splits.
    • /window zoom : permet de sortir d'un split (raccourci: alt+z)
  • N'oubliez pas … /help
    • Et pour une commande particulière: /help commande


Raccourcis clavier
  • En reprenant l'exemple de F7 et F8 pour naviguer dans les splits, on prend conscience de l'impérieuse nécessité de configurer son clavier.
  • Alt+k (touche) donne la touche et la commande associée.
    • Ex: Alt+k F8 affichera: meta2-19~ window -1
    • Ceci nous permet de passer au split précédent.
  • De même, nous pouvons obtenir facilement le code de la combinaison alt+curseur bas:
    • Alt+k Alt+curseur bas : meta-meta2-B
  • Armés de ces informations, nous n'avons plus qu'à associer alt+curseur bas (par exemple) comme nouveau raccourci à window -1
    • /key bind meta-meta2-B /window -1
  • Et pour la flèche du curseur haut associée à alt, je propose de désactiver/activer la barre des pseudos.
    • /key bind meta-meta2-A /bar toggle nicklist
  • À vous de voir pour le reste…
    • Sachez que vous pourrez être amené à éditer directement le fichier de configuration contenant les raccourcis.
    • Mais uniquement en cas d'erreur bloquante, ou trop compliquée à corriger à coup de /key bind.
    • Bref, rien de tout cela ne devrait vous arriver. Le fichier est .weechat/weechat.conf , section key.



Configuration de WeeChat

Une simplicité biblique
  • /set config.section.option valeur : pour modifier un élément de configuration.
  • /set config.* : pour voir un sous-ensemble de la configuration (set pour tout voir).
  • /help config.section.option : raison d'être d'une option précise.
  • /save : sauve dans un fichier de config l'état actuel de la configuration (la sauvegarde est automatique dans le fichier utilisé par WeeChat).
  • /reload : recharge la configuration, au cas où vous préféreriez modifier de façon externe les fichiers concernés (en cas de blocage par exemple).
  • /plugin : voir les extensions chargées (vous devez avoir au minimum l'extension irc).


Exemple: définir une connexion
  • Nous allons paramétrer une connexion permanente, dont les paramètres seront sauvegardés dans la configuration.
    • /server add fn irc.freenode.org : défini un alias fn pour freenode, pour référencer la connexion.
    • /set irc.server.fn.nicks VotrePseudo : si il est différent du login, utilisé par défaut. On peut préciser plusieurs pseudos, au cas où le premier serait indisponible sur ce serveur (déja utilisé par exemple, ou interdit).
    • /set irc.server.fn.command "/msg nickserv identify xxxxx" : si vous voulez vous authentifier automatiquement.
    • save
  • Et par la suite, pour vous connecter rapidement à freenode en rappellant la connexion sauvée:
    • /connect fn
  • Pour retrouver rapidement la liste des serveurs déja paramétrés:
    • /server list


La peinture facile
  • WeeChat possède des facilités pour la gestion des couleurs.
  • Tapez /color pour passer dans le buffer des couleurs.
    • Vous y trouverez les paires de couleurs utilisées, ainsi que la palette utilisable dans votre terminal (avec alt+c).
  • Je passe sur la syntaxe pour envoyer des kikoos multicolorés dans les buffers. Vous la trouverez dans la doc.
  • Nous allons maintenant nous intéresser à la colorisation de l'interface.
  • Comme vous le savez, un /set peut être suivi d'un joker
    • Pour avoir tous les paramètres liés aux couleurs: /set weechat.color.*
  • Avec ces informations, nous pourrions personnaliser les différents éléments de l'interface.
  • Pour faire original, je vais simplement changer quelques couleurs peu lisibles sur le fond de mon terminal.
    • C'est extrèmement aisé, grâce au buffer color.
  • Vous avez sans doute remarqué que le nom des intervenants dans un chat est affiché avec des couleurs très variées.
    • Les couleurs dépendens de cette variable de configuration, qui a pour valeur par défaut:
    • weechat.color.chat_nick_colors = "cyan,magenta,green,brown,lightblue,default,lightcyan,lightmagenta,lightgreen,blue"
    • Le choix d'une couleur sur un pseudo se fait grace à un hash sur celui-ci.
    • Pour modifier la couleur de son propre pseudo, on utilise la variable weechat.color.chat_nick_self (et pour les conversations en privé, vous avez également weechat.color.chat_nick_other ).
  • Pour avoir la liste des codes couleurs utilisables, on a deux possibilités:
    • /color dans weechat, puis alt+c
    • ou depuis un terminal: weechat-curses -c
    • Je préfère utiliser /color , suivi d'un e pour afficher la représentation des couleurs utilisées actuellement.
  • On peut rentrer des noms de couleurs, ou bien directement les codes couleurs obtenus ci-dessus. On peut également préciser des attributs.
  • On peut également utiliser /color alias pour nommer un code couleur dans WeeChat.
  • Ouvrez une fenêtre une fenêtre splittée, tapez des commandes de couleur dans l'une, et regardez le résultat dans le buffer color visible dans l'autre.
    • Par exemple:
    • /set weechat.color.chat_nick_colors = "118:091,232:105,238:219,234:216,152:090,10:20,255:091,118:009"



Les scripts

Lest scripts s'utilisent par le biais des extensions
  • Un script Weechat n'appelle pas directement les fonctions de l'API WeeChat.
  • Le script passe par un wrapper qui appelle ensuite l'API. Il y a un wrapper par langage de script.
  • Ces wrappers font partie des extensions (terminologie WeeChat).
  • Les extensions se controlent avec la commande plugin (/help plugin).
  • L'avantage de cette façon de procéder est que les différences entre langages de scripts deviennent minimes. L'inconvénient est qu'il faut écrire un wrapper pour chaque langage concerné, puisque l'accès direct à l'API WeeChat n'est pas la méthode conseillée (bien que l'on puisse surement utiliser quelque chose comme FFI du projet LuaJIT, mais cela sort largement de notre propos).


Installation d'un script existant
  • Avant d'écrire un script, commençons par en installer un.
  • J'ai choisi le bip, pour ne rien rater sur IRC.
  • À propos, avez-vous remarqué l'angoisse diffuse instillée par la possibilité de plus être joignable vingt-quatre heures sur vingt-quatre ? Ou pire, de rater un appel ?
    • Les marchands de téléphones ont fondé leur business là dessus.
  • Vous trouverez le script Perl qui fait bipper dans le dépot WeeChat consacré aux scripts.
  • Vérifier que l'extension Perl est chargée:
    • /plugin list
  • Si ce n'est pas le cas, c'est probablement parce que Perl n'est pas installé (et on vous comprend).
    • Il faudra donc installer Perl, et charger l'extension (pas besoin de quitter WeeChat) : /plugin load perl
  • Et pour charger le script:
    • /perl load ~/.weechat/perl/beep.pl


Écriture d'un script minimaliste à l'aide de Lua
  • Où se trouve le wrapper Lua ?
    • Comme dit précédemment, vous ne chargerez pas vous même le wrapper avec un require dans le script Lua. Vous allez devoir passer par les extensions WeeChat, qui dans ce cas consiste en un wrapper Lua vers l'api C de WeeChat.
    • Il faut charger votre script de cette façon depuis WeeChat: /lua load chemin/vers/script.lua
    • Attention, pour décharger le script, il faudra passer le nom défini en tant que name dans la fonction weechat.register.
  • Passons au script proprement dit. Il faut commencer par enregistrer son script.
    • weechat.register(name, author, version, license, description, shutdown_function, charset)
    • weechat.register("test_lua","jseb","0.1","beerware","pas de desc", nil, "utf-8")
  • On peut tenter une sortie dans le buffer core de WeeChat (celui qui affiche les messages du programme).
    • weechat.print ("","ça marche")
    • Notez que le print intégré à Lua, qui écrit sur la sortie standard, est fonctionnel, mais ne vous attendez pas à ce que la sortie suive la logique de votre script. Comme l'exécution du script est séquentielle, vous aurez déja la sortie de vos print, puis la reconstruction de l'écran. Cette méthode est donc déconseillée, hormis pour des messages de diagnostics pour le debug (et autant utiliser weechat.print)
  • Le script sera exécuté une seule fois, et ensuite il faudra le recharger pour recommencer le traitement. Il peut donc être plus pratique d'ajouter une commande à WeeChat en créant un hook.
  • Nous allons utiliser la fonction de l'API hook_command.
    • Nous pourrions également programmer une temporisation (weechat.hook_timer) ou une commande batch (lancée en fond avec weechat.hook_procees et qui permet peut être l'écriture de coroutines, même si à mon avis weechat.hook_timer sera plus adaptée pour cela).
    • Pour le transformer en commande, il faut utiliser weechat.hook_command, en précisant le nom de la commande, son mode d'emploi (pour /help et le nom de la fonction callback dans le script).
    • À noter que les paramètres de la fonction callback seront imposés: buffer où a été lancée la commande, paramètres de la commande et data (non utilisé dans le script, tout passe dans la variable qui contient les paramètres).
    • Description dans l'API de hook_command
  • Maintenant que le script est enregistré et transformé en commande, il ne reste plus qu'à transformer en majuscule la chaine passée en paramètre.
    • J'utilise pour cela une fonction de la classe string de Lua, qui malheureusement ne fonctionne qu'avec les caractères ascii et ne mettra donc pas en majuscule les accents. J'aurais bien utilisé la fonction weechat_string_toupper, mais elle n'est pas disponible en dehors de l'api et semble d'après l'exemple de la doc ne pas convertir non plus les accents.
  • Pour afficher dans le buffer en cours, j'utilise une petite astuce. Je demande l'exécution de la commande irc say dans le buffer en cours.
    • weechat.command(buffer,"/say "..la_chaine_en_majuscules)
  • Il aurait été tentant d'utiliser cette commande:
    • weechat.print(buffer,str_up)
    • mais elle ne ferait qu'afficher la chaine en majuscules dans le buffer actuel, et vos interlocuteurs ne la verrait pas.
  • Voici le listing complet du script:

~/.weechat/lua$ cat hello.lua 
#!/usr/bin/env lua

--pour faire un /lua reload, il faut soit que le script soit dans autoload, soit spécifier son nom (celui déclaré dans weechat.register, pas le nom de fichier). Autrement, il sera bien déchargé, mais jamais recharge.                        

function hurler_fx(data, buffer, args)
  local str_up = args:upper()
  weechat.command(buffer,"/say "..str_up)
end

--weechat.register(name, author, version, license, description, shutdown_function, charset)
weechat.register("test_lua","auteur","0.1","noware","pas de desc", nil, "utf-8")

hook = weechat.hook_command ("hurler", "script pour hurler dans un buffer",
                             "[chaine à hurler]", "la chaine que vous souhaitez hurler","",
                             "hurler_fx","")

weechat.print ("","le script est chargé")


  • À tester depuis weechat avec :

/lua load lua/hello.lua 
/hurler et maintenant, tout le monde va m'écouter

  • NB : je décline toute responsabilité en cas de kick.



Terriblement t'efficace (nanananana nanana)

  • J'espère vous avoir convaincu de tenter un essai avec WeeChat.
  • Pour en savoir en plus, je vous renvois à l' excellente documentation
  • Bon t'chat , lol !
  • Je remercie FlashCode, l'auteur de WeeChat, pour son excellent soft, et pour avoir bien voulu répondre à quelques-unes de mes questions… sur son canal IRC, bien entendu :)
    • irc.freenode.org : #weechat-fr