pytestator, un script vim pour gérer ses tests unitaires plus facilement

J’ai (enfin) releasé un petit script vim pour rendre plus agréable l’utilisations de tests untaires pour python dans vim.

Le principe est assez simple, ce script vous introduit plusieurs nouveaux raccourcis dont voici les deux plus intéressants:

  • ,s qui vous fais passer du fichier de tests au fichier testé et vice versa (s pour swap)
  • ,tr qui lance le fichier de tests correspondant au fichier que vous êtes en train d’éditer, que vous soyez dans ce fichier ou dans le fichier de test (tr pour test run)

La page du script avec un peu plus d’informations et du mauvais anglais: http://www.vim.org/scripts/script.php?script_id=3151

Sinon des mappings que j’aime bien pour écrire mes tests unitaires:

imap ,ar self.assertRaises()<left>
imap ,ae self.assertEqual()<left>
imap ,at self.assertTrue()<left>
imap ,af self.assertFalse()<left>

Mes maps git pour vim

Un poste rapide pour vous donner mes maping pour git dans vim. J’ai beau avoir regardé tous les plugins vim pour git, aucun ne m’a plus, je me suis donc contenté de faire plein de maps pour pouvoir utiliser git dans vim et ce le plus rapidement possible.

Le principe est très simple et surtout facile à retenir: les maps commencent tous par “,” (comme tous mes maps ou presque) puis par “g” (comme git), après je rajoute une lettre qui est le début de la commande et je la mets parfois en majuscule quand c’est la même commande avec des options différentes. C’est tout bête mais ça permet de ne taper que 3 char pour faire n’importe quelle commande (qui est beaucoup plus longue à écrire), je me retrouve même à ouvrir vim pour utiliser git maintenant -_-“

map ,ga :!git add -p<cr>
map ,gA :!git add %<cr>
map ,gf :!git add
map ,gs :!git status<cr>
map ,gc :!git commit -m “”<left>
map ,gC :!git add %<cr>:!git commit -m “”<left>
map ,gd :!git diff<cr>
map ,gD :!git diff —cached<cr>
map ,gp :!git push<cr>
map ,gP :!git pull<cr>
map ,gb :!git branch<cr>
map ,gB :!git branch
map ,gh :!git checkout
map ,gi :!git init<cr>
map ,gt :!tig<cr>
map ,gl :!git log<cr>

Vrac 1

Ne débordant pas de temps et surtout d'énergie à consacrer à l'écriture d'un poste plus fourni je vous livre une petite série de liens et d'astuces collectés dernièrement. Une bonne partie ne sont pas récente mais comme je les ressors souvent autant les remettre:

  • Ompload, une fonction bash pour envoyer le fichier en argument sur omploader.org, un chouette site qui support plein de formats de fichiers
  • ompload()
    {
        curl -# -F file1=@"$1" http://omploader.org/upload|awk '/Info:|File:|Thumbnail:|BBCode:/{gsub(/<[^<]*?\/?>/,"");$1=$1;print}';
    }
  • Conworld, un livre en ligne sur comment créer un univers fictif, je cherchais ça depuis longtemps donc je partage.
  • wordreference, le site pour traduire des mots, chaque options de recherches peut être rajoutées en moteur de recherche rapide pour firefox. Si vous utilisez vimperator n'hésitez pas à définir des mots clef pour ces moteurs de recherche.
    Par exemple: nf pour anglais ? français et fn pour français ? anglais.
  • Une vidéo qui montre comment très simplement préparer une grosse série de commandes shell à exécuter. Un must, ça m'a fait économiser énormément de temps à ne pas avoir à faire des boucles à la con et pour peut que vous maitrisiez les macro, :s et autre cela permet plein de choses sympa.
  • Imagemagick est un outil en CLI permettant de faire des modifications sur des images. Par exemple la commande pour redimensionner une image en gardant le ratio taille-largeur et en spécifiant une hauteur maximal est:
    convert image.png -resize 64x64\> image_small.png
    Les autres commandes de redimensionnement (imagemagick permet bien plus que ça).
  • Bartab, un super addon pour firefox qui permet de « décharger » (wééé !) un onglet pour économiser de la mémoire et plein d'autres joyeusetés comme ne par charger automatiquement les onglets au redémarrage de firefox pour pas attendre 50 ans que tout se charge.
  • Comment installer Gimp pour Ubuntu pour utiliser le mode mono fenêtre (infiniment plus agréable que le mode pop-ups). Pour les autres distributions il faut se procurer la version 2.7, comment activer le mode est décrit dans le lien.
  • Il est sympa le moteur de crysis quand même
  • "Down for everyone or just me" un grand classique, ce site très pratique permet de tester sur un autre site internet est mourru.

C'est tout pour aujourd'hui.

Colombo 2.0

Dés qu’elle est entrée dans mon bureau, j’ai su que l’affaire ne sentait pas bon. On ne fait pas carrière dans ma branche si on ne développe pas un solide sixième sens pour flairer les problèmes. Et manifestement, mon embrouillomètre me criait que je ferais mieux de me planquer sous mon bureau la tête cachée dans une des poches de mon imper.

Malheureusement, mon vieux fauteuil donnait des signes de fatigue, la machine à café agonisait, et j’avais un besoin urgent de renflouer mes caisses. Je n’avais pas les moyens de faire le difficile.

— Thibault Jouannic, détective TMA privé ?
— Lui même, à votre service m’dame. Entez, je vous en prie.

D’un signe de main, je l’invitai à s’asseoir. Pendant qu’elle s’exécutait, je l’examinais à la dérobée. Mon boulot m’amenait plutôt à côtoyer de gros barbus aux dents jaunies par la clope et le café, et portants des tee-shirt rigolos. Aussi, cette belle brune élancée en tailleur élégant avait immédiatement éveillé mon attention. D’un point de vue professionnel, j’entends.

— Alors m’dame, que puis-je faire pour vous être utile ?

J’ai toujours pensé qu’un bon détective était comme un médecin. Pas de bon diagnostic sans connaître les symptômes. Le problème, c’est que mes clients me prenaient souvent pour une espèce de devin vaudou, et j’étais obligé de les soumettre à un interrogatoire digne d’un inquisiteur espagnol pour espérer obtenir le minimum d’indices.

— Je suis Lucie S., webmaster d’un site de petites annonces agricoles, et depuis quelques temps il semble que les performances ne soient plus au rendez-vous.
— Vous voulez dire que le site est lent ?
— En fait, ce site n’a jamais été une foudre de guerre, mais depuis deux jours, la situation est devenue catastrophique. La moindre requete nécessite 45 secondes avant d’aboutir. Quand on ne récupère pas une page blanche. Et le moteur de recherche, le cœur du site, est complètement inutilisable.

Dr Cog
Creative Commons License photo credit : Balakov

Les performances ! Un grand classique. 90% de mes affaires concernaient des sites qui se trainaient comme des escargots neurasthéniques. Parfois, rajouter quelques caches rendait le problème supportable, mais la plupart du temps, la conception de base était tellement médiocre qu’il n’y avait rien à faire. Allez expliquer ça à un client désespéré.

Bref ! Cela s’annonçait comme une petite enquête de routine. Alors pourquoi mon instinct me criait-il qu’il y avait anguille sous roche ?

— Vous dites que depuis deux jours, la situation a empiré. Que s’est-il passé de spécial à ce moment là ?
— Mais justement ! Rien, rien du tout.

C’était louche. Soit elle me mentait, soit elle ignorait quelque chose, mais son histoire n’était pas crédible, et elle même ne semblait pas convaincue. Je décidai de la titiller.

— Aucune erreur dans vos tests unitaires ou fonctionnels ? Que dit votre plate-forme d’intégration continue ?
— Euh…

J’avais touché juste. Je posais la question pour la forme, j’aurais été bien surpris d’apprendre l’existence de tests automatisés. La plupart du temps, je devais m’estimer heureux si des conventions de codages étaient définies et respectées. Mais bon, la question avait le don de rendre mes clients mal à l’aise, et un client qui n’est pas droit dans ses chausettes est moins enclin à discuter mes tarifs. Et puis, ça me distrait.

— Écoutez, je vais voir ce que je peux faire. Mais il me faudra un accès au serveur de production, un compte sur le gestionnaire de source, et un dump récent de la base de données.
— Je vous communiquerai ces informations dans la journée. Il y a autre chose, me dit-elle l’air embarassée.
— Oui ?

Je masquai un petit sourire. Quand un client ne rechigne pas à vous donner l’accès à la prod, c’est qu’il y a toujours autre chose.

— Un grand salon d’agriculture a lieu dans deux jours. Une présentation publique du site est prévue. C’est un site subventionné par le ministère, vous comprenez. Et si la situation n’est pas revenue à la normale d’ici là, nous risquons de nous retrouver dans une situation délicate.

Ben voyons ! J’aimais travailler dans le stress du temps qui passe. Corriger un bug qui semblait insolvable est gratifiant, mais aucune sensation n’est plus exaltante que celle de le faire dans un délai aussi court. Et puis, ça me permet de gonfler mon tarif.

— Je prends l’affaire en main m’dame. Envoyez moi les données dont j’ai besoin, et je commence sur le champ.

Une fois qu’elle fut sortie, je m’abandonnais à une méditation contemplative. Réfléchir représente une part importante de mon temps de travail. Je dirais même que c’est la part la plus importante. Il m’est même arrivé de résoudre des affaires sans poser les mains sur mon clavier bépo.

L’ennui, avec la réflexion, c’est qu’elle passe facilement pour de l’oisiveté pour les non-inités. C’est pour ça que je prends toujours l’air affairé et soucieux quand j’attends un client. Pour avoir l’air compétent et efficace.

C’est important, les apparences, dans mon métier. Pourquoi croyez-vous que je laisse traîner toutes ces piles de dossiers poussiéreux ? Pas pour le travail, tout est numérisé. Non, c’est simplement parce qu’un détective sans imper et qui ne pue pas le tabac froid. Ça ne fait pas sérieux.

Je suis bien resté deux heures, les pieds sur mon bureau couvert de paperasse bidon, sirotant mon infusion à la verveine (que je ne bois qu’en cachette, un vrai détective est censé carburer au café noir dégueulasse), avant de parvenir à la conclusion suivante : j’étais dans une impasse. J’avais le crime, mais pas le mobile.

Quelqu’un aurait-il saboté volontairement le site pour plomber la présentation publique ? Un hacker ? Un script-kiddie ? Un concurrent ? Je n’arrivais pas à m’en persuader. Les gens regardent trop la télé. Ils s’imaginent que nous autres, détectives TMA, passont notre temps à combattre le crime virtuel organisé, sauver des demoiselles en détresse et empêcher in-extremis des fusées d’exploser. Tout ça, c’est la faute à Colombo.

La réalité est toute autre, et le quotidien d’un détective TMA est finalement assez banal. Point de grand bantitisme. Point de course poursuite effrénée dans les limbes du web. Simplement quelques corrections orthographiques par ci, un petit bug css (damn IE!) par là. Et puis, métro, popote, dodo. Comme tout le monde, finalement.

C’est justement pour cette raison que je ne parvenais pas à accepter l’idée d’un acte de piraterie. Règle n°1 du détective TMA : «  N’attribue jamais à la malveillance ce qui peut s’expliquer par l’incompétence  ». Quelqu’un avait merdé dans cette histoire, et il fallait trouver qui.

Mala Strana
Creative Commons License photo credit : Pensiero

C’est maintenant que les choses sérieuses allaient commencer. Je commençai par vérifier la justesse des informations envoyées par ma cliente, et récupérais le trunk du site. Haha ! Quelqu’un avait commité un «  Thumbs.db  » dans le dossier «  img  ». Quelle bande de newbies ! Mais !? Ils avaient également commité leur répertoire de backup, rempli de dumps sql ?! Seigneur ! Je sentis mes yeux tenter de jaillir hors de leurs orbites.

Pris d’un doute, je récupérai également en local la version de production du site. Autant vous dire qu’à ce moment, je m’attendais à tout. Pour le plaisir, j’ouvris quelques fichiers au hasard grâce à mon éditeur de geek préféré (vim, car tout le monde sait que les vrais pros n’utilisent jamais emacs). La syntaxe hasardeuse, l’indentation erratique, et les caractères de saut de lignes aléatoires me firent vite tourner la tête, le cœur au bord des lèvres.

— «  Fiston, dans la vie, on ne mélange jamais les espaces et les tabulations  », me disait souvent ma grand-mère, de son air sage et pénétrant de vétéran qui avait connu le Cobol. Il faut croire que tout le monde n’a pas eu la chance d’avoir une grand mère comme la mienne.

En dernier recours, je décidai de jeter un coup d’œil à l’historique svn. En parcourant rapidement les derniers messages de commits, quelque chose attira mon regard. Serait-il possible que… Quelques diffs plus tard, j’étais fixé. Les mains derrière la tête, je me laissai aller en arrière, un sourire sur les lèvres. Voilà une affaire rondement menée.

Le cœur léger, je décrochai le téléphone, et appelai ma cliente.

— Allo ?
— Thibault Jouannic, détective TMA à l’appareil. J’ai quelque chose qui peut vous intéresser.
— Vous avez trouvé ?
— Pas par téléphone. Écoutez, je veux que vous réunissiez l’équipe de développement au complet, dans vos locaux, demain 9h. Assurez-vous que tout le monde soit présent. Et amenez des croissants.

Van Williams & Bruce Lee
Creative Commons License photo credit : Elmo Alves

Sans attendre sa réponse, je raccrochai. Pour ma peine, je décidai de me préparer une autre infusion. Demain promettait d’être une belle journée.

Le lendemain, je me rendis au siège de S… S.A., dans ma vielle guibarde fumante. J’ai l’habitude de me déplacer en vélo, mais pour les rencontres avec mes clients, ça me donne un genre.

Quand j’arrivai à la réunion, tout le monde était déjà présent, et à l’heure, preuve s’il en est de la gravité de la situation. Les croissants étaient chauds, le café finissait de glouglouter dans le percolateur, les choses s’annonçaient bien.

Je m’emparai d’une viennoiserie, et demandai à chacun de se présenter.

— Frédéric B., chef de projet
— Solange C., développeuse
— Alfred D., designer / intégrateur
— Anatole P., développeur stagiaire
— Pierre Z, développeur
— Lucie S., webmaster

Après ce petit tour de table, je leur tournai le dos, et m’approchai de la fenêtre, faignant de contempler le paysage bétonneux des alentours d’un air inspiré. Dans mon métier, il faut savoir ménager ses effets. Lorsque je jugeai la tension nerveuse suffisante, je me retournai, et commençai mon numéro.

— Comme vous le savez, j’ai été contacté hier par Lucie S., ici présente, pour élucider un cas mystérieux. Depuis 2 jours, le site www.….com semble rencontrer des problèmes de lenteur anormale. Est-ce exact ?
— Tout à fait.
— Cet évenement survient juste avant une importante présentation publique du site. Si l’anomalie n’est pas résolue, sa réputation sera ruinée, et par exension celle de l’agence web qui l’a conçu et réalisé, n’est-ce-pas ?
— En effet.
— Comme vous, j’ai pensé à un acte malveillant. La vile démarche d’un concurrent amer et jaloux d’avoir été éconduit lors de l’appel d’offre. Aussi ai-je analysé en détails les différents logs de votre serveur de production. J’ai vite découvert que je faisais fausse route. Je n’ai rien remarqué d’anormal. En revanche, je peux vous dire une chose.

Je les parcourus tous de mon regard de détective pénétrant. La tension était à son comble, chacun était pendu à mes lèvres, retenant son souffle.

— Mesdames, messieurs, il s’agit d’un acte interne. Qui plus est, j’affirme que le coupable se trouve dans cette pièce !

L’annonce fit son effet. Des exclamations d’indignation éclatèrent, des cafés furent renversés, certains manquèrent s’étouffer avec leur croissant. J’attendis, inflexible, que le calme revienne, et imposai le silence de mon œil de lynx (la bestiole, pas le navigateur).

— Lucie S., vous m’avez annoncé lors de notre premier entretien qu’aucun changement n’étais survenu sur l’application au moment du début des anomalies. Et bien, madame S., vous vous êtes trompée. Il y a bel et bien eu une livraison ce jour là.

Le chef de projet bondit alors de sa chaise, en renversant son café, hurlant presque.

— Mensonge ! Calomnies ! Aucune livraison n’a été déployée en production depuis 10 jours. Vérifiez le svn, le dernier tag date de plus d’une semaine. Et aucun ticket n’est passé en état «  cloturé  » durant cette période ! Vous mentez !
— Croyez-moi bien, j’ai vérifié ces éléments. Et comme vous le dite, aucune livraison n’a été déployée en utilisant votre procédure de livraison officielle. — J’appuyais sur le terme — En revanche, il y a bien eu une livraison sans passer par votre procédure de déploiement !
— C’en est trop, rugit le chef de projet. Comment pouvez-vous l’affirmer ?
— C’est simple, j’ai eu l’occasion de comparer la version svn des sources, avec ce qu’on peut trouver sur vos serveurs de production et préproduction. Le résultat fut trés instructif, je dois dire.

Pens in light
Creative Commons License photo credit : maistora

Je les observai d’un air amusé, avant de reprendre.

— J’ai en effet pu constater que ces trois environnements n’étaient pas synchronisés. Il ne peut y avoir qu’une seule explication. Quelqu’un n’a pas respecté votre procédure de déploiement.

L’assistance resta muette. Des murmures incrédules se firent entendre. Le chef de projet, hagard, bafouilla.

— Mais… Qui ? Qui pourrait faire une chose pareille ?
— Voyez-vous, j’ai eu l’occasion d’analyser les logs svn de votre application. Quelque chose a attiré mon attention. Quelque chose qui n’aurait pas du se trouver là.

Suspense. J’observai une pause théâtrale, avant de m’écrier :

— Votre log svn est en effet truffé de messages de commits vides !

Stupeur dans l’auditoire. Le chef de projet, le souffle coupé, retomba sur sa chaise, effondré. Je m’emparai d’un croissant, leur laissant le temps de reprendre leurs esprits avant de continuer.

— Plus intéressant. J’ai également remarqué que ces commits félons se sont multipliés depuis quelque temps.

Je pointai alors un doigt vengeur vers l’un de mes auditeurs.

— Monsieur Anatole P. Pourriez vous nous indiquer à quel moment vous avez commencé à travailler sur ce projet ?!

Le pauvre stagiaire, au comble de l’embarras, parvint à peine à bredouiller une réponse intelligible.

— Une… une semaine environ. Mon stage a débuté au début du mois.
— Monsieur Anatole P. N’est-il-pas vrai que vous avez, au cours de cette semaine, réalisé des développements sur le site dont nous parlons ?
— Oui, mais…
— Et n’est-il-pas vrai qu’au cours de ces travaux, vous avez modifié l’un des fichiers de configuration de l’application ?
— Peut-être bien que oui.
— Et bien monsieur Anatole P., lorsque vous avez livré vos travaux directement sur le serveur de production, vous avez écrasé un fichier de configuration avec les paramètres de la plate-forme d’intégration. Cela a eu pour action de désactiver tous les caches de la production !

Not getting Involved
Creative Commons License photo credit : TarikB

Dans la folie qui s’ensuivit, le chef de projet, rouge de colère, tonna.

— Anatole ! Je vous jure que vous allez…
— Un instant ! — J’avais usé de toute mon autorité pour l’interrompre — J’affirme qu’il n’y a qu’un seul coupable dans cette pièce. Et ce coupable n’est pas Anatole.

Stupéfaction.

— Monsieur Frédéric B., chef de projet du site www.….com, je vous accuse d’avoir confié les accès de votre plate-forme de production à un stagiaire inexpérimenté. Je vous accuse de l’avoir laissé travailler sur un projet sans l’avoir formé à vos méthodes. Je vous accuse de ne pas avoir mis en place de procédure systématique de vérification ni de validation de son travail par ses pairs plus expérimentés. Enfin, au nom d’Ada, sainte patronne des geeks et codeurs, je vous accuse de contribuer à la médiocrité logicielle générale, en omettant de mettre en place et de promouvoir des bonnes pratiques de développements. Arrêtez-le !

Deux gorilles de la sécurité se saisirent du félon, et l’emmenérent tandis que ses cris de rage et menaces de vengeances raisonnaient dans les couloirs.

Quand le silence revint, je savourai les regards admiratifs qui se posaient sur moi. Ma cliente ne put s’empêcher de me demander :

— Mais comment avez-vous su ? Pour la livraison en production ?
— C’est simple, ma chère. Lorsque j’ai réalisé que certains fichiers n’étaient pas synchrones entre les différents environnements, j’ai fouillé pour en découvrir l’origine. J’ai remarqué que certaines modifications apportées récemments sur le svn se trouvaient bien sur la préproduction, mais jamais sur la production. En revanche, d’autres commits avaient été directement reportés sur la production, mais étaient absent de la production. Et il se trouve que ces commits anormaux avaient tous un même auteur : Monsieur Anatole P., ici présent.

En remontant dans l’historique, j’ai tout de suite vu que ses premières contributions étaient trés récentes. J’ai évidemment pensé à un stagiaire.
— Votre analyse est limpide.
— Élémentaire, même. Cette affaire prouve une fois de plus l’une des Grandes Lois Immuables des TIC.
— Laquelle ?
— Il n’existe pas d’anomalie, quelle qu’elle soit, dans laquelle aucun stagiaire ne soit impliqué.
— Écoutez, monsieur Jouannic. Vous nous avez démontré que vous êtes un homme capable. Nous avons une place de chef de projet à pourvoir. Seriez-vous disponible ?
— Désolé, m’dame, mais ça ne m’intéresse pas. Indépendant je suis, indépendant je reste. Vous savez, détective freelance, ce n’est pas un métier, c’est un mode de vie.
— Bon. Si vous changez d’avis, n’hésitez pas à me contacter.
— J’y penserai. Je vous enverrai ma facture d’ici demain.

Tout en m’installant derrière le volant ma fidèle guibarde, je sortis mon agenda et vérifiai mon emploi du temps du reste de la semaine. Rien. Parfait, j’allais pouvoir partir en vacances quelques jours. Je l’avais bien mérité.

– FIN –

Lire les pages de manuel avec vim c'est possible !

Je ne présente plus cet éditeur de texte ultime qui est sans aucuns doute le seul éditeur de texte valable dans ce bas monde.

Si vous codez un petit script shell ou encore un programme en C, les pages de manuel sont souvent indispensable (et même parfois en Français o/). Alors au lieu de les lire avec la veille commande man , ayez le réflexe vim et lisez là directement dans votre session vim.

Il faut lancer le runtime dans votre vimrc

runtime ftplugin/man.vim

La commande Vim pour lire la page de setenv par exemple :

:Man setenv

Pour les feignant comme moi, un petit mapping à mettre dans votre vimrc qui permet d'avoir la page de man de la commande qui se trouve en dessous du curseur avec la touche K (en mode normal).

nnoremap K :Man <cword><CR>

Afficher les caractères spéciaux dans Vim

De temps à autre, lors de l’écriture de scripts, il m’arrive d’accompagner l’appui de la touche espace de sa voisine, la touche « ALT-GR » ce qui du coup crée une espace insécable, invisible sur le moment jusqu’à ce que le script plante (la plupart du temps après un « pipeALT-GR + 8 »)…

Heureusement, grâce à Vim, il est possible d’afficher certains caractères spéciaux via les variables « list » et « listchars ».

« list » permet d’activer l’affichage des caractères spéciaux, on l’active en tapant « set list » et on le désactive en tapant « set list! » ou « set nolist ».
« listchars » contient la liste des caractères spéciaux à afficher séparés par des virgules (le « c » après le « : » étant le caractère de remplacement à afficher) :

  • Fin de ligne : « eol:c »
  • Tabulation : « tab:xy » (« x » étant le premier caractère de la tabulation, « y » étant le reste qui peut varier)
  • Espaces de fin de ligne : « trail:c »
  • Débordement à droite de la ligne par rapport à l’écran : « extends:c »
  • Débordement à gauche de la ligne par rapport à l’écran : « precedes:c »
  • Espace insécable : « nbsp:c »

Voici, pour exemple, les paramètres provenant de mon fichier « ~/.vimrc » :

" Affiche les caractères spéciaux
set listchars=nbsp:¤,tab:>-,trail:¤,extends:>,precedes:<
set list

Avant :
VIM (list = false)

Après:
VIM (list = true)

Sympa, non ? Merci vim ! :)

Habillez vos commentaires facilement grâce à Vim

J’ai pour habitude d’afficher de jolis commentaires bien démarqués du code source afin de pouvoir les lire très rapidement sans devoir les chercher. Hors, selon les langages de programmation, ceux-ci ne s’écrivent pas de la même façon. Je vous propose donc une petite macro (à placer dans votre « ~/.vimrc ») permettant d’habiller facilement vos commentaires ; celle-ci étant accessible grâce à la touche F8 en mode normal.

Voici la macro en question :

map <F8> :call Comment()<CR>

function! Comment()
    let ext = expand("%:e")

    if ext == 'html' || ext == 'htm'
        execute "normal yyPPI<!--^[lDjI   ^[j^DI-->^[j"
        return
    endif

    if ext == 'php' || ext == 'js'
        execute "normal I// ^[A //^[yyPv$r/yyjpj"
        return
    endif

    if ext == 'txt'
        execute "normal I| ^[A |^[yyPr+lv$r-$r+yyjpj"
        return
    endif

    if ext == 'tex'
        execute "normal I% ^[A %^[yyPr%lv$r/$r%yyjpj"
        return
    endif

    if ext == 'c' || ext == 'cpp' || ext == 'cc' || ext == 'h' || ext == 'hpp'
        execute "normal yyPPI/*^[lDjI   ^[j^DI*/^[j"
        return
    endif

    " Style de commentaire par défaut
    if ext == 'sh' || ext == 'py' || ext == 'pl' || 1
        execute "normal I# ^[A #^[yyPr#lv$r/$r#yyjpj"
        return
    endif
endfunction

J’ai deux petites remarques à faire :

  1. « ^[ » correspond à « ECHAP » que l’on écrit en appuyant sur « CTRL+V » puis « ECHAP »;
  2. le style de commentaire par défaut doit être sur la dernière ligne à cause du test « || 1 » qui dans tous les cas validera la condition.

Voici le résultat obtenu selon le format de fichier :

  • Extension du fichier html ou htm :

    <!--
       Hello GNU Squad !
    -->
    
  • Extension du fichier php ou js :

    ///////////////////////
    // Hello GNU Squad ! //
    ///////////////////////
    
  • Extension du fichier txt :

    +-------------------+
    | Hello GNU Squad ! |
    +-------------------+
    
  • Extension du fichier tex :

    %///////////////////%
    % Hello GNU Squad ! %
    %///////////////////%
    
  • Extension du fichier c, cpp, h ou hpp :

    /*
       Hello GNU Squad !
    */
    
  • Extension du fichier sh, py, pl et tout le reste :

    #///////////////////#
    # Hello GNU Squad ! #
    #///////////////////#
    

À vous d’agrémenter ou de modifier selon vos besoins, si vous avez besoin d’aide, n’hésitez-pas à passer par les commentaires ;)

Un éditeur de texte avancé : Vim

Ce billet n'a pas pour vocation de vous apprendre à vous servir de Vim. C'est plutôt une introduction, qui vous présentera globalement les avantages, son histoire, la communauté française. Au final, vous deviendrez peut être fans de cet éditeur.

Vi Improved 

Vim est un éditeur de texte avancé qui s'utilise dans un terminal. Vim a été inspiré de Vi, un éditeur de texte, utilisé sur les systèmes Unix BSD. Vi est  un logiciel sous licence BSD. Vim avait pour objectifs de reprendre l'ensemble des fonctionnalités de vi, mais a été considérablement amélioré. Il portait au départ le doux nom de Vi IMitation. Ayant largement dépassé l'ancêtre Vi, Vi IMitation s'appelle désormais Vi IMproved (Vi AMélioré).

Vim - un éditeur de texte avancé

En console !

Tout. Vim est capable de lire toutes sortes de fichiers textes, des fichiers de configurations, des fichiers contenant le code source d'un programme, de simples fichiers textes, ou encore des fichiers LaTeX. Vim contient une infinité de raccourcis clavier pour divers taches : suppression d'un certain nombre de lignes, indentation d'une partie du texte, déplacements très rapide dans le texte, plusieurs presse-papiers disponibles (un pour chaque lettre de l'alphabet), remplacements qui acceptent les Regex, découpage de l'écran verticalement et horizontalement, ceci à l'infini ( vous serez limité par la taille de votre écran), afficher la documentation, sans quitter Vim, mais également un système d'onglet. Le tout cela fait gagner un temps considérable étant donné qu'il n'y a pas besoin de souris pour tout cela, le clavier est largement suffisant. La souris est tout de même utilisable en utilisant une option, mais je la déconseille.

À chacun son vim.

Vim est un éditeur personnalisable à l'infini, vous pouvez choisir votre thème de couleur, activer les numéros de ligne, changer les raccourcis clavier,  définir une barre de statut, définir la taille de vos tabulations, remplacer les tabulations par des espaces. Le nombre d'options est très vaste. En plus de cela, vous avez des options pour chaque langage, par exemple, vous pouvez activer la coloration syntaxique à l'intérieur d'une chaine de caractère en PHP pour avoir la coloration du HTML/SQL.

Extensible à l'infini

Mais vim ce n'est pas simplement ce que je viens de vous annoncer, c'est bien plus que cela. Vim est extensible à l'infini aux moyens de scripts. En effet, Vim possède son propre langage. Tout le monde peut coder ses extensions. Une base de données contient les principaux, voire la totalités des scripts disponibles : le site officiel de Vim, rubrique scripts. Vous pouvez par exemple, avec le script NERDTree, disposez d'un menu sur la gauche de Vim, qui fait explorateur de fichiers. Vous pouvez disposer d'un script nommé DBext, qui vous permettra d'explorer une base de données. Vous avez des scripts pour faire à peu près ce que vous voulez, même des choses beaucoup plus simples, comme la correction orthographique. A noter qu'il existe aussi des scripts qui s'installent de la même manière qu'un logiciel (pour les gros scripts ) comme par exemple TagList, qui vous permettra de rajouter la liste des fonctions/variables dans un menu, à la manière des IDE.

Une interface graphique



GVim - L'interface graphique pour Vim

Il existe une interface graphique pour vim, appelée gVim. Elle permet aux débutants d'être moins déroutante, et possède des menus/boutons qui peuvent rendre l'approche de Vim plus facile. Je ne conseille pas ce logiciel, je pense que si on veut se former correctement, il faut mettre les mains dans le cambouis, et utiliser directement Vim pour apprendre plus rapidement, bien que les perles de sueur risquent de couler le long de votre front. Et d'autant plus qu'il y a deux fichiers de configuration pour ce logiciel, un pour le moteur vim, un autre pour l'interface graphique. La configuration de vim est déjà complexe, alors si en plus de ça, on doit retravailler un autre fichier, je pense que cela est une perte de temps inutile. Le principale avantage de logiciel, et que c'est le seul existant sous Windows. Et il existe d'ailleurs une version portable qui s'installe sur une clé USB. Cela peut s'avérer très pratique.

Vimperator, une extension de Firefox.

Vimperator est un plugin pour Firefox très pratique. En effet les raccourcis de vim servent à remplacer la souris dans Firefox. Depuis que je l'utilise, je ne peux plus m'en passer, on gagne vraiment du temps à ne plus se servir de la souris. Les raccourcis clavier sont multiples, assez faciles à retenir,, mais demande un temps d'apprentissage, même si on utilise vim régulièrement. Il faut savoir aussi que la configuration de base de vimperator enlève tous les menus, et barre des défilements. Cela est très perturbant, mais maintenant que je me suis rendu compte de la place qu'on perdait avec tous ces menus, je ne les remets qu'occasionnellement (je suis loin de le maitriser à 100 %). En conclusion, beaucoup de temps de gagner, une lisibilité améliorée. Que du bonheur. Une page d'explications est disponible sur le wiki francophone pour ceux que ça intéresserait.

Une communauté présente

Vim n'est pas un logiciel facile à manipuler, principalement au début.  Il existe une énorme communauté anglophone autour de Vim, avec de nombreux sites internant exposant différents hacks/tutoriaux etc. Cependant il existe une communauté française, moins importante, mais présente, qui est très active, notamment avec la création d'un wiki, et d'un planet, regroupant différents billets de blogueurs ayant comme thématique Vim. Il y a également un très bon salon de discussion sur Jabber, ainsi que sur IRC : #vim-fr sur Freenode.net (je vous conseille Jabber évidement).

Lancement d'un nouveau projet

Je préfère prévenir, dès le début ce billet sera technique, enfin difficilement accessible à des non informaticiens, mais pas totalement. Enfin bon après cette brève introduction, je vous laisse découvrir :-). Voilà un moment que je pense à ce projet; Il sort enfin au grand jour. Juste après le billet sur Jabber, il ne pouvait pas tomber mieux. Qu'est-ce que c'est ? Un client Jabber écrit en Python. Je vais vous le présenter en détails, ce que je veux en faire, les idées principales etc...

Un nouveau client

Comme je viens de vous le dire, j'ai comme projet personnel de créer de A à Z un nouveau client Jabber. C'est un projet très ( trop ? ) ambitieux. Vous allez me dire qu'il existe plein de clients, pour tous types d'utilisation etc. Celui que j'espère créer ne sera pas tout à fait comme les autres. Je préfère le dire tout de suite : je ne sais absolument pas si j'ai les compétences nécessaires pour le réaliser, mais je vais faire tout mon possible pour y arriver. On a en temps normal des clients qui sont soit des clients graphiques comme Gajim ou Psi, ou des clients consoles comme MCabber. Ces deux types de clients ne sont pas utilisés par les mêmes personnes, et peuvent être utilisés dans des contextes totalement différents. Ce nouveau client aura la particularité d'être soit un client console, soit un client graphique, au choix de l'utilisateur. En plus de ce premier choix, l'utilisateur pourra également choisir son type d'interface graphique Qt ou GTK+.

Spécificités

Il sera publié sous licence GPL dans sa troisième version. Ce client sera écrit en Python, un langage que j'ai commencé à étudier au cour de mon stage. Ce langage est très intéressant, et très puissant. Vu l'utilisation qu'on peut en faire, le nombre de bibliothèques existantes, et la communauté active, j'ai eu envie de connaître mieux ce langage. Concernant les bibliothèques, je vais utiliser xmppony, qui est un fork de xmpppy, pour la gestion du protocole XMPP. Pour l'interface, pour le mode console, la bibliothèque curses sera celle utilisée, et pour le graphique PyQt pour la bibliothèque Qt, et PyGTK, pour GTK+.

Concernant tout ce qui est sauvegarde, je ne sais pas encore si je vais passer par des fichiers, ou si il y aura une base de données de type sqlite. J'ai appris à me servir de pysqlite2 récemment, je trouve ça assez pratique. Il faut que j'étudie plus le sujet à ce niveau. Et puis ce n'est pas ce qu'il y a de plus important pour la première version qui sortira. Cette première version sera très pauvre, et ne permettra que d'effectuer le strict minimum : se connecter, envoyer un message, voir la liste de ses contacts etc. Tout ce dont j'ai parlé au dessus viendra par la suite.

Le petit plus

Autre point important que je n'ai pas encore soulevé, une fonctionnalité qui je l'espère ravira bon nombre de personnes si je réussis à l'implémenter, l'intégration d'un moteur ressemblant à celui de ViM ( en plus pauvre évidemment ;-) ). Cela correspondrait à une suite de raccourcis clavier, permettant de se passer totalement de souris, et de gagner beaucoup de temps. Je vois d'ici venir les trolls : Pourquoi ViM et pas Emacs ? Parce que Emacs pue ( ça c'est fait :D ). Plus sérieusement, je verrai à intégrer un mode Emacs par la suite, si j'arrive à faire celui pour ViM.

Le mot de la fin

Beaucoup de travail en perspective, beaucoup de compétences à acquérir pour mener à bien ce projet. Mais bon, nous ne sommes pas pressés. Je vais me servir de ce blog comme mémo personnel pour les éventuels problèmes que je rencontrerai au cours du développement. Ce blog pourrait alors servir à d'autres personnes. Une autre personne a décidé de m'aider pour réaliser ce projet, mais commencera plus tard, car cette personne ne connaît pas tout ce que je viens de citer. Donc je commencerai seul, sinon le projet va être retardé, déjà qu'il a pris beaucoup trop de retard à mon goût. Alors ça y est, le projet d'un nouveau client Jabber est lancé. Reste plus qu'à coder et à trouver un nom (accessoirement).

Gérer ses templates pour Vim sans fichiers externes

Suite à un billet posté sur le site Informatique et liberté évoquant une solution originale pour gérer ses templates avec Vim, j’ai décidé d’améliorer un peu la technique en utilisant la puissance de ce superbe éditeur combinée à celle de sed.

Habituellement, pour chaque template, nous créons un fichier externe placé dans notre dossier personnel ~/.vim. Prenons l’exemple d’un template HTML dans ~/.vim/templates/html que l’on appellerait de cette manière dans notre fichier de configuration ~/.vimrc :

autocmd BufNewFile *.html 0r ~/.vim/templates/html

Logiciels utilisés :

  • Vim 7.2
  • GNU Sed 4.2

Le but du jeu est de centraliser toute notre configuration dans notre ~/.vimrc et donc d’y inclure nos templates. Le seul moyen, à ma connaissance, est de mettre ceux-ci en commentaires afin qu’ils n’interfèrent pas avec le reste de la configuration, il ne restera plus alors qu’à trouver le template adéquat, pour cela on passera par des marqueurs de début et de fin de template, voici donc ma solution :

" BEGIN HTML
" <html>
"     <head>
"         <title>Hello gnusquad !</title>
"     </head>
" </html>
" END HTML

autocmd BufNewFile *.html call Template('HTML')

function! Template(type)
    exe "0r !sed -n '/^\"\\s*BEGIN " . a:type . "$/,/^\"\\s*END " . a:type . "$/ {s///;/^$/d;s/^\" //;p}' $MYVIMRC"
    echo '--> INFO : Template ' . a:type . ' charge < --'
endfunction

Nous retrouvons donc en première partie le template mis en commentaire et délimité par les marqueurs « BEGIN HTML » et « END HTML », la deuxième partie appelle la fonction « Template » avec en paramètre « HTML » lorsque l'on crée un nouveau fichier ayant son nom correspondant au motif « *.html », la troisième et dernière partie contient la fonction « Template » proprement dite qui prend donc un paramètre servant à délimiter le template, on y trouve une jolie ligne de sed qui paraît obscure à première vue mais qui est très simple : on localise et ne traite que la partie contenue entre « BEGIN xxx » et « END xxx », on supprime ces deux lignes puis les lignes vides puis on décommente le template, le tout étant inséré dans le buffer courant. :)

Vous aurez donc compris qu'il est très simple d'ajouter de nouveaux templates : il suffit juste que le paramètre passé à la fonction « Template » corresponde à la partie présente après « BEGIN » et « END » de votre template. ;)