ctags abilita due funzionalità: che consente di saltare dalle chiamate di funzione alle loro definizioni e il completamento omni. Il primo significa che quando si sta effettuando una chiamata a un metodo, si colpisce g]
o CTRL-]
salterà nel punto in cui tale metodo è definito o implementato. La seconda funzione indica che quando si digita foo.
o foo->
, e se foo è una struttura, verrà mostrato un menu a comparsa con completamento del campo.
cscope ha anche la prima funzione - usare set cscopetag
- ma non l'ultima. Tuttavia cscope aggiunge inoltre la possibilità di saltare in uno dei luoghi in cui viene chiamata anche una funzione.
Per quanto riguarda saltare su una base di codice, ctags ti condurrà sempre e solo verso il luogo in cui è implementata la funzione, mentre cscope può mostrarti dove viene chiamata anche una funzione.
Perché dovresti scegliere l'uno rispetto all'altro? Bene, io uso entrambi. ctags è più facile da configurare, più veloce da eseguire e se ti interessa saltare in un modo ti mostrerà meno linee. Puoi semplicemente eseguire :!ctags -R .
e g]
funziona. Inoltre permette quella cosa omni completa.
Cscope è ottimo per basi di codice più grandi e sconosciute. L'installazione è una seccatura perché cscope ha bisogno di un file contenente un elenco di nomi di file da analizzare. Anche in vim, per impostazione predefinita non ci sono associazioni di tasti impostati - è necessario eseguire :cscope blah blah
manualmente.
Per risolvere il problema del pugno ho uno script bash cscope_gen.sh
che assomiglia a questo:
#!/bin/sh
find . -name '*.py' \
-o -name '*.java' \
-o -iname '*.[CH]' \
-o -name '*.cpp' \
-o -name '*.cc' \
-o -name '*.hpp' \
> cscope.files
# -b: just build
# -q: create inverted index
cscope -b -q
Questo cerca il codice che mi interessa, crea l'elenco cscope.files e crea il database. In questo modo posso eseguire ":! Cscope_gen.sh" invece di dover ricordare tutti i passaggi impostati.
Mappo la ricerca di cscope su ctrl-spazio x 2 con questo frammento, che mitiga l'altro downer di cscope:
nmap <C-@><C-@> :cs find s <C-R>=expand("<cword>")<CR><CR>
C'è questo plugin cscope_maps.vim che configura un mucchio di associazioni simili. Non riesco mai a ricordare cosa significano tutte le opzioni, quindi tendo ad attenermi allo spazio ctrl.
Quindi, per concludere: ctags è più facile da impostare e funziona principalmente senza fare molto altro, è vitale anche per l'omni-completo. cscope fornisce più funzionalità se devi mantenere una base di codice ampia e per lo più sconosciuta, ma richiede più lavoro con le gambe.
make tags
nella directory principale del kernel e ho giocato saltando e la maggior parte delle volte finisce nel posto sbagliato. Ho letto che ctags ha problemi con il preprocessore c, ma considerando che ctags è usato in lxr ci deve essere ovviamente qualcosa che può essere fatto.