octobre 2019, mise à jour 30/09/2020
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.
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
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 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() 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
).
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.
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
.
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.
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
sqrt(3)
Comme précédemment on obtient la racine carrée de 3 = 1.73205080756887729352, en tapant :. !bc -l
.
2^16
Résultat : 65536
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>
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.