Vim voor programmeurs

Dirk van Deun, dirk at dinf.vub.ac.be
September 2008

Een kort overzicht van enkele features van vim die specifiek nuttig zijn bij het programmeren.

1. Make

Het programma make zorgt ervoor dat je project gecompileerd en gelinkt wordt; en als het fout gaat, krijg je een lijst van foutmeldingen te zien. Het gelijknamige commando :make in vim doet hetzelfde, maar als het compileren mislukt is, opent vim daarna automatisch het eerste bestand waar een fout gevonden is, en zet het de cursor ook al op de lijn waar de fout ontdekt is. Na het verbeteren van de eerste fout, kun je met het commando :cnext of :cn de volgende fout opzoeken, en zo voort. Met :cprevious of :cp ga je naar de vorige foutpositie terug. Bij :cc toont vim je de foutmelding die bij de huidige positie hoort nog eens.

De instelling

:set autowrite
is bijzonder handig in combinatie met make. Ze zorgt ervoor dat vim altijd het huidige bestand eens opslaat vooraleer aan een make-operatie te beginnen. (Dit is maar een van de gelegenheden waarbij er automatisch gesaved wordt als deze instelling gemaakt is; ze heeft ook invloed bij een aantal commando's die dienen om een nieuw bestand te openen.)

2. Tags

Om van programmacode in je editor hypertekst te maken, waarbij identifiers links zijn naar de plaats van hun definitie, moet vim een index van alle bestanden van het project ter beschikking hebben. Zulk een index maak je met het programma ctags. Met

ctags -R *
laat je een index maken van alle programmacode in de huidige directory en alle subdirectory's ervan. Het indexbestand heet tags, en als je vim start vanuit een directory waarin zulk een tags-bestand staat, wordt het automatisch gebruikt. Dan kun je de toetsencombinatie ctrl-] gebruiken om een link te volgen, en ctrl-t om een niveau terug te springen. Nu is ctrl-] wel een combinatie die door sommige terminal emulators wordt afgevangen, dus het kan gebeuren dat het niet meteen werkt. In dat geval kun je de functie gemakkelijk aan een functietoets verbinden, met een commando als
:map <F2> <C-]>
Dit is natuurlijk iets wat je beter meteen in je .vimrc zet.

Het kan gebeuren dat er meerdere definities van een bepaalde identifier bestaan in een groot project. Met :tnext of :tn kun je de volgende proberen, met :tprevious of :tp ga je dan terug naar de vorige.

Tenslotte: je kunt je editor ook meteen openen met

vim -t identifier
Dan opent vim meteen het juiste bestand op de juiste regel voor de definitie van de identifier in kwestie. Als je grote aanpassingen doet aan een project, moet je af en toe het tags-bestand verversen door ctags opnieuw te runnen. Het is echter niet erg dat de tags niet compleet overeenkomen met de huidige staat van het project: vim kan voor de meeste kleine veranderingen compenseren.

3. Man pages

UNIX-achtige operating systems bevatten meestal een on-line handleiding in de vorm van manual pages, of man pages, zoals ze gewoonlijk genoemd worden. Om bijvoorbeeld alle opties te kennen bij het commando cp, het standaardprogramma om bestanden te copiëren, tik je

man cp
cp staat in het eerste deel van de man pages, dat programma's beschrijft die je aan de command line kunt gebruiken. Maar de manual bestaat uit acht delen, en vooral delen 2 en 3 zijn interessant bij het programmeren: deel 2 bevat de system calls, en deel 3 de routines van de standaard C-library. Sommige identifiers komen in meerdere delen van de manual voor, zoals printf, wat niet enkel de naam van een library routine is, maar ook van een programma. Als je gewoon om de man page van printf vraagt, krijg je de eerste de beste, namelijk die uit deel 1 van de manual. Om expliciet de printf uit deel 3 van de manual te kiezen, tik je
man 3 printf

Het opzoeken van man pages is ook geïntegreerd in vim. Met het simpele commando K ga je naar de man page van de identifier onder de cursor. In de uitzonderlijke gevallen waarin je expliciet moet zeggen, in welk deel van de manual gezocht moet worden, zoals bijvoorbeeld in het geval van printf, geef je het deel van de manual vooraf op: in dit geval tik je dus 3K.

4. Grep

Met tags maak je hyperlinks van identifiers die je zelf in het project definieert, en dankzij het commando K zijn ook de namen van system calls en standaard library routines hyperlinks, weliswaar niet naar hun definitie, maar naar hun man page. Maar het kan ook voorkomen dat je niet geïnteresseerd bent in de definitie of de beschrijving van een identifier, maar dat je wilt weten waar hij overal gebruikt wordt in een project. Daarvoor kun je het programma grep gebruiken.

grep identifier *
zoekt de identifier in kwestie in alle bestanden in de huidige directory, en toont in welke bestanden hij gevonden is. De volgende stap is dan die bestanden te openen en eens van dichterbij te bekijken.

Dit is wat primitief. Gelukkig is grep op net dezelfde wijze als make geïntegreerd in vim. Als je

:grep identifier *
uitvoert in vim, gebeurt hetzelfde als wanneer je grep gebruikt aan de command line, maar daarna wordt automatisch het eerst gevonden bestand geopend, en de cursor op de lijn gezet, waar de identifier voor het eerst voorkomt. Net zoals na een :make kun je dan met :cn en :cp tussen vindplaatsen heen en weer lopen.

5. Praktische instellingen

Vim kent teveel instellingen om nog maar te beginnen ze hier op te sommen. Ik noem er drie die specifiek handig zijn bij het programmeren, en twee die je eventueel veel ergernis kunnen besparen:

Dit zijn dus alweer goede kandidaten voor opname in je .vimrc.