IRC: Wee ou non ?
Par Jean-Seb le dimanche 25 décembre 2011, 19:29 - Linuxeries - Lien permanent
Vous connaissez tous IRC, et principalement Freenode, l'auberge
espagnole du Logiciel Libre.
Pour le client à utiliser, c'est une autre histoire…
Pendant des années, j'ai utilisé Irssi. Et puis, un jour…
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
- Vous retrouverez dans la doc tout ce que je n'ai évidemment pas sorti de nulle part
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
- Et pour une commande particulière:
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.
- Ex: Alt+k F8 affichera:
- 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 (setpour 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
/colorpour 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
/setpeut être suivi d'un joker- Pour avoir tous les paramètres liés aux couleurs:
/set weechat.color.*
- Pour avoir tous les paramètres liés aux couleurs:
- 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 égalementweechat.color.chat_nick_other).
- Pour avoir la liste des codes couleurs utilisables, on a deux possibilités:
/colordans 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 aliaspour 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
colorvisible 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
- Il faudra donc installer Perl, et charger l'extension (pas besoin de
quitter WeeChat) :
- Et pour charger le script:
/perl load ~/.weechat/perl/beep.pl
- Tous les scripts sont référencés ici:
Écriture d'un script minimaliste à l'aide de Lua
- Une introduction
- Vous aurez également besoin du guide de référence de l'API C de WeeChat
- Où se trouve le wrapper Lua ?
- Comme dit précédemment, vous ne chargerez pas vous même le
wrapper avec un
requiredans 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.
- Comme dit précédemment, vous ne chargerez pas vous même le
wrapper avec un
- 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 avecweechat.hook_proceeset qui permet peut être l'écriture de coroutines, même si à mon avisweechat.hook_timersera 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/helpet 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
- Nous pourrions également programmer une temporisation
(
- 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.
- 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
- Pour afficher dans le buffer en cours, j'utilise une petite astuce. Je
demande l'exécution de la commande irc
saydans 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