octobre 2019, mise à jour 30/09/2020

Vim

Comme beaucoup je me suis mis un jour à Vim. Les débuts ont été déroutants, mais maintenant je ne jure que par VIM.

Ce court article recense certaines de mes maniaqueries de petit programmeur du dimanche.

Tohtml

Pour les besoins de ce site j'ai testé un certain nombre de logiciels de coloration syntaxiques d'un code source en html. Le plus abouti est certainement Gnu source-highlight. Mais comme tout logiciel performant il nécessite un temps pour se l'approprier. Finalement j'ai gardé ma bidouille dans vim utilisant la commande TOhtml. Voir l'article dédié Tohtml

Compilation / Execution dans Vim

Très souvent nous avons besoin de compiler et ou exécuter le code source que nous sommes en train d'éditer. Si c'est du python il suffit de mapper une ou deux touches pour ce type de fichier.

Lorqu'il s'agit de C ou C++, cette stratégie pose des problèmes si le code source importe une librairie. La méthode normale est de faire un Makefile dédié au programme dans lequel on précise la librairie à importer. Cependant lorsqu'on fait un programme court de quelques dizaines de lignes la rédaction du Makefile devient un effort démesuré, alors qu'il s'agit juste de rajouter à la ligne de compilation un -lmachin.

Pour contourner l'écueuil j'ai utilisé des commodités de Vim : la commande execute et la fonction getline.

La commande execucte

La commande execute (en abrégé exec) execute une chaine de caractères comme si elle était une commande vim .Voir l'article de l'excellent site Learn Vimscript the Hard Way. Voir aussi l'aide en ligne de Vim (:h exec).

La fonction getline()

La fonction getline() récupère une ligne dans le fichier courant. Son argument est le numéro de la ligne que l'on veut récupérer. Voir l'aide en ligne de vim (:h getline).

Combinaison des deux

Exemple : compiler le tampon en édition avec gcc en indiquant le chargement d'une librairie, ici la librairie gd.

1. Dans le .vimrc on mappe une touche comme ceci :

map <F2> :exec getline(2)

Cette commande a pour effet de récuperer le contenu de la ligne 2 et de l'exécuter.

2. On place dans le fichier source à la ligne 2 le contenu suivant

/*
!gcc % -o %< -lgd
...
*/

La commande de compilation doit se situer à l'intérieur d'un commentaire.

Sur le même principe on peut mettre à jour le tampon, le compiler et l'exécuter :

/* gd-plot.c
:w | !gcc % -o %< -lgd && ./%< && ./gd-plot
...
*/

Généralement j'utilise deux lignes : la ligne 2 pour tester la compilation et la ligne 3 pour tester le programme. Dans mon .vimrc les touches F2 et F3 sont mappées pour exécuter respectivement la ligne 2 et la ligne 3.

Calculs dans vim en utilisant bc

Le calculateur bc est disponible dans toutes les distributions. C'est une application GNU (bc).

Dans vim on peut l'invoquer facilement pour remplacer une ligne ne comprenant qu'un calcul par son résultat. En mode normal, alors que le curseur est sur cette ligne on tape :. !bc ou :. !bc -l.

Opérations arithmétiques simples
30*29*28*27*26/12

En mode normal et alors que le curseur est sur cette ligne, on tape :. !bc

La ligne est remplacée immédiatement par le résultat qui est 1425060.

Fonctions trigonométriques
4*a(1)

On tape cette fois :. !bc -l et on obtient : 3.14159265358979323844

L'option -l charge la librairie standard math, mais tous les nombres sont alors traités comme des nombres à virgule. Voir le man de bc.

La fonction a(1) calcule arctan(1).

Si on avait voulu 64 décimales on aurait fait :

scale=64; 4*a(1)

Alors :. !bc -l aurait remplacé cette ligne par π avec 64 décimales :

3.1415926535897932384626433832795028841971693993751058209749445920

Racine carrée
sqrt(3)

Comme précédemment on obtient la racine carrée de 3 = 1.73205080756887729352, en tapant :. !bc -l.

Puissances
2^16

Résultat : 65536

Mapper une touche

Dans une session où l'on pense avoir beaucoup de calculs on peut s'offrir le luxe de mapper une touche. Exemple : nmap <F9> :. bc -l <CR>

Exécution d'un bout de script bash

Chacun sait combien les scripts bash peuvent réserver de mégardes. Il est donc parfois précieux de tester un bout de script de manière isolée.

Comme dans le paragraphe précédent on fourgue cette fois à bash, et non bc, le soin de vérifier. Exemple

On voudrait renommer des fichiers situés dans le dossier $HOME/tmp ayant la forme :

CR du 11.01.2020.pdf, CR du 12.09.2019.pdf, CR du 24.12.2019.pdf

comme suit

CR-2020-01-11.pdf, CR-2019-09-12.pdf, CR-2019-12-24.pdf,

On peut tenter le script :

cd $HOME/tmp
re="CR\ du\ (..)\.(..)\.(....)\.pdf" # regex
for f in CR*.pdf
do
   g=$(sed -E "s/$re/CR-\3-\2-\1.pdf/" <<< "$f")
   mv  "$f" "$g" 
done

puis faire 101,107 !bash, où 101 et 107 sont les numéros de lignes du script

Ouf! ça marche.


Réalisé avec Qlam - LGPL