Un tag è una specie di segnaposto. I tag sono molto utili nella comprensione e nella creazione di codice C: sono un insieme di segnalibro per ogni funzione di un file C e sono molto utili per saltare alla definizione di una funzione dal punto dove essa viene richiamata e per ritornare al punto di partenza.
Prendiamo l'esempio seguente.
Diciamo che state lavorando sulla funzione foo() e capitate sulla funzione bar(). Ora, per vedere cosa fa bar(), si fa uso dei tag. Si può saltare alla definizione di bar() e poi saltare di nuovo indietro. Se necessario, si può saltare ad un'altra funzione richiamata dentro bar() e ancora indietro.
Per usare i tag si deve prima eseguire il programma ctags su tutti i file sorgenti. Questo crea un file chiamato tags, che contiene dei puntatori a tutte le definizioni di funzione e viene usato da VIM per portarvi alla definizione corretta.
Le combinazioni di tasti per saltare avanti e indietro sono CTRL-] e CTRL-T. La pressione di CTRL-] nel punto dove viene richiamata bar() porta il cursore all'inizio di bar(). Si può saltare indietro da bar() a foo() semplicemente premendo CTRL-T.
ctags viene richiamato con
$ ctags opzioni file |
Per creare un file "tags" da tutti i file .c nella directory attuale basta questo comando:
$ ctags *.c |
Nel caso di un albero dei sorgenti che contenga file C in differenti sottodirectory, si può richiamare ctags in quella che è la radice del codice con l'opzione -R e verrà creato un file "tags" contenente i tag di tutte le funzioni nell'albero del codice. Ad esempio
$ ctags -R *.c |
Con ctags si possono usare molte altre opzioni, che vengono spiegate nel pagina di man di ctags.
I marcatori sono una sorta di segnaposto come i tag, ma possono essere collocati in ogni punto di un file e non sono limitati solo a funzioni, elenchi ecc. Inoltre i marcatori devono essere impostati manualmente dall'utente.
Impostando un marcatore non si ha nessuna indicazione dello stesso. Un marcatore è solo una posizione in un file che verrà ricordata da VIM. Considerate il seguente codice:
Supponete che state modificando la riga x++; e volete tornare a quella riga dopo averne modificate altre. Potete impostare un marcatore su quella riga con la combinazione di tasti m' e poi tornarvi con ''.
VIM vi permette di impostare più di un marcatore. Questi marcatori vengono immagazzinati in certi registri, a-z, A-Z e 1-0. Per impostare un marcatore ed immagazzinarlo in un registro, ad esempio j, tutto quello che dovete fare è premere mj. Per tornare al marcatore dovrete digitare 'j.
I marcatori multipli sono molto utili per andare avanti e indietro dentro un pezzo di codice. Prendendo lo stesso esempio, si può passare dal marcatore su x++; ed un altro a y=x; e poi saltare dall'uno all'altro o a un qualsiasi altro punto e poi tornare indietro.
I marcatori possono estendersi anche a file differenti. Per usare questi marcatori c'è bisogno di usare i registri maiuscoli, A-Z. I registri minuscoli vengono usati solo all'interno di un singolo file e non attraversano file multipli. Per essere chiari, se volete mettere un marcatore in un file foo.c nel registro "a" e poi passate ad un altro file e premete 'a: il cursore non salterà alla posizione precedente. Se volete un marcatore che vi porti ad un file differente avrete bisogno di usare un registro maiuscolo. Ad esempio usate mA invece di ma. Parlerò del lavoro su file multipli in una sezione seguente.
Considerate il seguente pezzo di codice
Per qualche ragione avete dimenticato cosa sono y e z e volete tornare alla loro dichiarazione alla svelta. Un modo di farlo sarebbe cercare all'indietro delle y o delle z. VIM offre una soluzione più veloce e semplice. Le lettere gd stanno per Goto Declaration ["vai alla dichiarazione" NdT]. Con il cursore su "y", se premete gd questo si sposterà alla dichiarazione : struct Y y;.
Una combinazione simile è gD: questa vi porta alla dichiarazione globale della variabile sotto il cursore. Dunque se volete andare alla dichiarazione di x, tutto quello che dovete fare è premere gD ed il cursore si sposterà alla dichiarazione di x.