[pso] [vim tips] code browsing

Cosmin Ratiu cosminratiu at gmail.com
Thu Mar 31 16:02:37 EEST 2011


Salut,

Astazi vreau sa vorbesc despre doua programe (cscope si ctags), cu
care se poate usura enorm editarea proiectelor netriviale.
Ambele iau niste surse C/C++ si le indexeaza permitand operatii de
cautare prin cod.
Diferenta este ca ctags permite doar gasirea definitiilor, in timp ce
cscope permite in plus gasirea tuturor locurilor unde este folosita o
functie/variabila si este ceva mai bun la parsat C++.

Eu folosesc cscope de vreo 3 ani pentru editat sursele kernel-ului de
Linux si isi face treaba foarte bine, asa ca despre el o sa discut.

Setup:
Este nevoie de instalarea programului: "apt-get install cscope" in
Debian (cred ca si in Ubuntu se cheama la fel).

Folosire:
Pasul 1: Generarea index-ului pentru un code-base dat.
Pentru kernel, se poate rula comanda 'make ARCH=x86 cscope', care va
construi fisierul index 'cscope.out'
Pentru alte tree-uri de surse, puteti folosi o functie de genul in
.bashrc (sau un script):

function gen-cscope
{
    find "${@:-.}" -type f -iregex
'.*\.\(c\|h\|cpp\|hpp\|cc\|hh\|cxx\|hxx\)' | cscope -b -i-
}

Se ajunge in directorul radacina al proiectului de indexat si se da
comanda 'gen-cscope'.
Alternativ, se poate da o lista de directoare comenzii 'gen-cscope' in
care se vor cauta surse de indexat.
La final ar trebui sa aveti un fisier cscope.out in directorul curent.

Pasul 2: Alias-uri de vim.
cscope poate fi folosit cu comenzi de vim (':help cscope' pentru
detalii), insa este destul de incomod ca pentru fiecare operatie sa
scriem o comanda.
Alternativ, se pot face niste key bindings pentru a usura folosirea.
Am atasat o secventa de comenzi pentru .vimrc care fac aceste
alias-uri. Pentru a le folosi, puneti-le in ~/.vimrc. Puteti sa le
modificati a.i. sa fie pe gustul vostru.
In continuare o sa explic ce fac.

Prima parte cauta un fisier index cscope in directorul curent si in
parintii acestuia si il incarca. In felul asta puteti avea un singur
fisier index pentru un proiect mare si acesta se va incarca automat
indiferent in ce subdirector va aflati.

Daca cursorul este pe un nume de functie/variabla, se poate apasa:
 - 'Ctrl + ]' pentru a sari la definitie.
 - 'Ctrl + \' urmat de 's' pentru a cauta toate locurile unde este folosita.
 - 'Ctrl + \' urmat de 't' pentru a cauta textul de sub cursor in tot
textul surselor (un fel de 'grep -r')

In plus, se pot da comenzile ':tag x' pentru a sari la definitia lui
'x' si ':cs find s x' pentru a cauta toate locurile unde apare 'x'.
Si ca ultima comanda, cand porniti vim, puteti da 'vim -t x' pentru a
sari direct la definitia lui 'x'.

Cand faceti o cautare, lista de aparitii se poate vedea cu F10. Pentru
a ne plimba inainte/inapoi intre aparitii, se foloseste F11/F12. Nu
uitati si de 'Ctrl + o' si 'Ctrl + p', care sunt echivalentul la
back/forward intr-un web browser.



Stiu ca este multa informatie, dar daca reusiti sa o internalizati va
va usura foarte mult editarea de cod mai complex de un fisier. Daca il
folositi pe sursele kernel-ului, nu o sa mai aveti nevoie de lxr si o
sa va ajute sa il intelegeti mai bine.

Cosmin.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: vimrc-cscope
Type: application/octet-stream
Size: 1454 bytes
Desc: not available
URL: <http://cursuri.cs.pub.ro/pipermail/pso/attachments/20110331/c006348a/attachment.obj>


More information about the pso mailing list