En général ViM est utilisé en conjonction avec d'autres outils puissants comme ctags et gdb. ctags est très rapide pour la navigation au milieu de millions de lignes de code « C/C++ » et gdb est pour le déboguage de code « C/C++ ». Une brève introduction à ces deux commandes indispensables sera donnée dans ce chapitre.
ctags est la commande la plus puissante pour coder en C, C++, Java, Perl, scripts shell Korn/Bourne ou Fortran. Les développeurs utilisent intensivement ctags pour naviguer au travers de milliers de fonctions à l'intérieur de programmes C/C++. Voyez `man ctags' sous Unix. Il est très important que vous appreniez comment utiliser ctags pour développer des programmes en C, C++, Java, etc. La navigation est la tâche simple la plus importante lors de développement en C ou C++. L'utilisation de ctags peut vous aider à rapidement lire le code en sautant de la ligne d'appel à la fonction appellée, en s'enfonçant dans les appels de fonctions imbriquées, et en remontant de la fonction la plus imbriquée jusqu'à la fonction principale. Vous pouvez aller et revenir de fonction en fonction très rapidement.
Sans NAVIGATION vous serez complètement perdu ! ctags est comme le COMPAS magnétique nécessaire aux programmeurs.
Utilisation de ctags :
ctags *.cpp
gvim -t foo_function
gvim -t main
À l'intérieur de l'éditeur ViM, vous pouvez sauter à une fonction en tapant : (double point) tag nom_de_la_fonction comme ci dessous :
:tag fonction_exemple
Si vous voulez sauter dans la fonction à partir de la ligne du fichier contenant le nom de la fonction, placez le curseur juste avant le nom de la fonction et tapez CTRL+] (tapez la touche de contrôle et le crochet gauche simultanément).
// code d'exemple
switch(id_number) {
Case 1:
if ( foo_function( 22, "abcef") == 3 )
^
|
|
|
Placez le curseur ici (juste avant foo_function) et tapez CTRL+]
Ceci vous emmènera à la fonction nommée "foo_function".
Pour revenir à cette ligne tapez CTRL+t
Puisque ctags ne supporte pas directement le langage Embedded SQL/C (ESQL), le script shell suivant peut être utilisé pour créer les marques pour esql. ESQL/C est un ensemble de commandes SQL de base de donnée à l'intérieur de programmes « C ». Le ESQL/C d'Oracle est appellé Pro*C et Sybase, Informix ont ESQL/C et PostgreSQL a produit « ecpg ».
Sauvez ce fichier sous « sqltags.sh » et tapez chmod a+rx tags_gen.sh.
#!/bin/sh
# Programme pour créer les ctags pour les fichiers ESQL, C++ et C
ESQL_EXTN=pc
tag_file1=tags_file.1
tag_file2=tags_file.2
which_tag=ctags
rm -f $tag_file1 $tag_file2 tags
aa=`ls *.$ESQL_EXTN`
#echo $aa
for ii in $aa
do
#echo $ii
jj=`echo $ii | cut -d'.' -f1`
#echo $jj
if [ ! -f $jj.cpp ]; then
echo " "
echo " "
echo "*******************************************************"
echo "Les fichiers ESQL *.cpp files n'existent pas..."
echo "Vous devez générer les fichiers *.cpp à partir des *.pc"
echo "en utilisant le pré-compilateur Oracle Pro*C ou Sybase"
echo "ou le pré-compilateur Informix esql/c."
echo "Puis relancez cette commande"
echo "*******************************************************"
echo " "
exit
fi
rm -f tags
$which_tag $jj.cpp
kk=s/$jj\.cpp/$jj\.pc/g
#echo $kk > sed.tmp
#sed -f sed.tmp tags >> $tag_file1
#sed -e's/sample\.cpp/sample\.pc/g' tags >> $tag_file1
sed -e $kk tags >> $tag_file1
done
# S'occupe des fichiers C++/C - exclut les fichiers ESQL *.cpp
rm -f tags $tag_file2
bb=`ls *.cpp *.c`
aa=`ls *.$ESQL_EXTN`
for mm in $bb
do
ee=`echo $mm | cut -d'.' -f1`
file_type="NOT_ESQL"
# Exclut les fichiers ESQL *.cpp et *.c
for nn in $aa
do
dd=`echo $nn | cut -d'.' -f1`
if [ "$dd" = "$ee" ]; then
file_type="ESQL"
break
fi
done
if [ "$file_type" = "ESQL" ]; then
continue
fi
rm -f tags
$which_tag $mm
cat tags >> $tag_file2
done
mv -f $tag_file2 tags
cat $tag_file1 >> tags
rm -f $tag_file1
# Doit sortir le fichier des marqueurs pour fonctionner correctement...
sort tags > $tag_file1
mv $tag_file1 tags
Le script shell donné ci-dessous peut être utilisé pour générer les marques pour une très large variété de programmes écrits en JavaScript, les scripts PHP/FI, Korn, C, Bourne et beaucoup d'autres. C'est un module très générique.
Sauvez ce fichier sous tags_gen.sh et tapez chmod a+rx tags_gen.sh.
#!/bin/sh
tmp_tag=tags_file
tmp_tag2=tags_file2
echo " "
echo " "
echo " "
echo " "
echo " "
echo "Génère les marqueurs pour..."
while :
do
echo "Entrer l'extension du fichier pour lequel vous voulez générer des marqueurs."
echo -n "Les extensions de fichiers peuvent être sh, js, ksh, etc... : "
read ans
if [ "$ans" == "" ]; then
echo " "
echo "Mauvaise entrée. Essayez encore !"
else
break
fi
done
rm -f $tmp_tag
aa=`ls *.$ans`
for ii in $aa
do
jj=`echo $ii | cut -d'.' -f1`
#echo $jj
cp $ii $jj.c
ctags $jj.c
echo "s/$jj.c/$ii/g" > $tmp_tag2
sed -f $tmp_tag2 tags >> $tmp_tag
\rm -f tags $jj.c
done
sort $tmp_tag > tags
rm -f $tmp_tag $tmp_tag2
Vous utiliserez gdb extensivement avec Vi. Le déboguage est l'un des plus importants aspects de la programmation en tant que coût majeur du développement et des tests des projets.
Pour déboguer des programmes C/C++ vous utiliserez l'outil « gdb ». Voyez 'man gdb'. Vous devrez compiler vos programmes avec l'option -g3 comme
gcc -g3 foo.c foo_another.c sample.c
Pour configurer des alias utiles :
Configurez l'alias dans votre ~/.bash_profile
alias gdb='gdb -directory=/home/src -directory=/usr/monnom/src '
Donnera -
gdb foo.cpp
gdb> dir /hom2/another_src
Ceci ajoutera un chemin à la recherche de fichier
gdb> break 'some_class::func<TAB><TAB>
Ce qui complètera le nom de la fonction en vous évitant le temps de
frappe... et sortira comme -
gdb> break 'some_class::function_foo_some_where(int aa, float bb)'
Taper la touche TAB deux fois permet le complément de la ligne de commande, sauvant ainsi beaucoup de temps de frappe. C'est l'une des techniques les plus importantes pour l'utilisation de gdb.
Pour obtenir de l'aide en ligne -
gdb> help
Donne l'aide en ligne
gdb> help breakpoints
Donne plus de détails sur les points d'ancrage.
Pour placer les points d'ancrage et effectuer du déboguage
unixprompt> gdb exe_filename
gdb> b main
Ceci mettra un point d'ancrage dans la fonction main()
gdb> b 123
Ceci mettra un point d'ancrage à la ligne 123 du fichier courant
gdb> help breakpoints
Donne plus de détails sur les points d'ancrage.
Pour analyser des core dumps :
unixprompt> gdb exe_filename core
gdb> bt
Donne une trace de retour des fonctions et les numéros de lignes où le
programme a échoué
gdb> help backtrace
Donne plus de détails sur la trace de retour.
Vous pouvez aussi utiliser une version GUI de gdb appellée xxgdb.
Outils de perte de mémoire -