In het algemeen wordt Vim in samenwerking met andere krachtige tools zoals ctags en gdb gebruikt. De ctags is voor zeer snelle navigatie door miljoenen regels "C/C++" code en gdb voor het debuggen van de "C/C++" code. Een beknopte introductie van deze twee onmisbare opdrachten zal in dit hoofdstuk worden gegeven.
De ctags is de krachtigste beschikbare opdracht voor het coderen in C, C++, Java, Perl, Korn/Bourne shell scripts of Fortran. Ontwikkelaars gebruiken ctags zeer uitgebreid om "naar en vanuit" duizende functies C/C++ programma's te navigeren. Zie onder Unix 'man ctags'. Het is zeer belangrijk dat je MOET leren hoe deze ctags te gebruiken om programma's in C of C++, Java, enz.. te ontwikkelen. Navigatie is de belangrijkste taak tijdens het ontwikkelen in C of C++ code. Met behulp van ctags kun je de code zeer snel lezen door te springen van de aanroepende regel naar de functie en dieper in geneste functie-aanroepen gaan en naar het begin teruggaan. Je kunt zeer snel heen en weer van functie naar functie gaan.
Zonder NAVIGATIE zal je waarschijnlijk verloren zijn! ctags is als de magnetische KOMPAS naald voor de programmeurs.
Gebruik van ctags :
ctags *.cpp gvim -t foo_function gvim -t main
Binnen de Vim editor, kun je naar een functie springen door het intikken van een : (dubbele punt) tag < functie naam > als hieronder -
:tag voorbeeld_functie
Als je binnen de functie naar een regel met de naam van de functie wilt springen, plaats je de cursor direct voor de naam van de functie en druk je op CTRL+] (druk tegelijkertijd op de control-toets en linker blokhaak), hierdoor zal je automatisch direct rechts van de regel terechtkomen waar de functie begint!!
// voorbeeldcode switch(id_number) { Case 1: if ( foo_function( 22, "abcef") == 3 ) ^ | | | Plaats de cursor hier (direct voor foo_function) en druk op CTRL+] Hierdoor zal je naar de functie met de naam "foo_function" gaan. Druk op CTRL+t om naar deze regel terug te keren.
Aangezien ctags de Embedded SQL/C (ESQL) taal niet direct ondersteunt, kan het volgende script worden gebruikt om tags voor esql aan te maken. ESQL/C zijn database SQL opdrachten embedded binnen de "C" programma's. Oracle's ESQL/C wordt Pro*C genoemd en Sybase, Informix heeft ESQL/C en PostgreSQL heeft het produkt "ecpg".
Bewaar dit bestand als "sqltags.sh" en pas een a+rx tags_gen.sh toe.
#!/bin/sh # Programma om ctags voor ESQL, C++ en C bestanden aan te maken 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 "ESQL *.cpp bestanden bestaan niet.. " echo "Je moet de *.cpp vanuit het *.pc bestand genereren" echo "met behulp van de Oracle Pro*C pre-compiler of Sybase" echo "of Informix esql/c pre-compiler." echo "En vervolgens deze opdracht weer opnieuw uitvoeren" 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 # Handel nu alle C++/C bestanden af - sluit de ESQL *.cpp bestanden uit 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" # Sluit de ESQL *.cpp en *.c bestanden uit 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 # Moet tags bestand sorteren wil het juist werken .... sort tags > $tag_file1 mv $tag_file1 tags
Het hieronder gegeven shell-script kan worden gebruikt om tags voor een zeer grote variëteit aan programma's geschreven in variety of programs written in JavasScript, PHP/FI scripts, Korn shell, C shell, Bourne shell en vele anderen te genereren. Dit is een zeer algemene module.
Bewaar dit bestand als tags_gen.sh en pas een chmod a+rx tags_gen.sh toe.
#!/bin/sh tmp_tag=tags_file tmp_tag2=tags_file2 echo " " echo " " echo " " echo " " echo " " echo "Genereer tags voor ...." while : do echo " Voer de bestandsextensie in waarvoor je tags wilt genereren." echo -n " Bestandsextensie zou iets moeten zijn als sh, js, ksh, enz... : " read ans if [ "$ans" == "" ]; then echo " " echo "Onjuiste invoer. Probeer opnieuw!" 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
Je zou samen met Vi uitgebreid gebruik moeten maken van gdb. Debuggen is het belangrijkste aspect van programmeren aangezien de belangrijkste kosten van een softwareproject in het debuggen en testen gaan zitten.
Gebruik de too 'gdb' voor het debuggen van C++/C programma's. Zie 'man gdb'. Je moet je programma's met de optie -g3 compileren als
gcc -g3 foo.c foo_another.c sample.c
Voor het eenvoudig instellen van aliassen -
Stel een alias in in je ~/.bash_profile
alias gdb='gdb -directory=/home/src -directory=/usr/myname/src '
Give -
gdb foo.cpp
gdb> dir /hom2/another_src
Dit zal aan het bestandszoekpad worden toegevoegd
gdb> break 'some_class::func<TAB><TAB>
Hiermee zal de functienaam worden aangevuld om je tijd te sparen bij het typen... en zal uitvoer produceren als -
gdb> break 'some_class::function_foo_some_where(int aa, float bb)'
Het tweemaal indrukken van de TAB-toets is de voltooiïng van de opdrachtregel, wat je heel veel tijd zal besparen bij het typen. Dit is één van de belangrijkste technieken bij het gebruik van gdb.
Voor online hulp -
gdb> help
Geeft online hulp
gdb> help breakpoints
Geeft meer details over breakpoints.
Het instellen van breakpoints en het debuggen
unixprompt> gdb exe_filename
gdb> b main
Hiermee zal een breakpoint in de main() functie worden geplaatst
gdb> b 123
Hiermee zal een breakpoint in regel 123 van het huidige bestand worden geplaatst.
gdb> help breakpoints
Geeft meer details over breakpoints.
Voor het analyseren van de core dumps
unixprompt> gdb exe_filename core
gdb> bt
Geeft backtrace van functies en regelnummers waar het programma in gebreke bleef
gdb> help backtrace
Geeft meer details over backtrace.
Je kunt ook de GUI-versie van gdb, genaamd xxgdb gebruiken.
Memory leak tools -