cscope o ctags perché scegliere uno sopra l'altro? [chiuso]


131

Uso principalmente vim / gvim come editor e sto cercando di utilizzare una combinazione di lxr (Linux Cross Reference) e cscope o ctags per esplorare il sorgente del kernel. Tuttavia, non ho mai usato né cscopectags e mi piacerebbe sapere perché uno potrebbe sceglierne uno rispetto all'altro prendendo in considerazione il mio uso di vim come editore principale.

Risposte:


157

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 blahmanualmente.

Per risolvere il problema del pugno ho uno script bash cscope_gen.shche 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.


2
C'è un modo per rendere i tag più precisi? L'ho fatto make tagsnella 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.
Robert S. Barnes,

2
Se c'è un voodoo macro profondo, allora probabilmente i ctag falliranno :-( Lo uso principalmente per roba C ++, che si basa meno su quel lato delle cose (anche se ha i suoi problemi ...)
richq

12
set cscopetag( cst) per fare prima la ricerca dei comandi :tage CTRL-]attraverso cscope, poi i tag
Hasturkun

1
Inoltre, ctags è piuttosto lento nella ricerca ricorsiva, l'uso di "ctags -L cscope.files" velocizzerà notevolmente la generazione di tag.
Aaron H.

1
@ RobertS.Barnes sta usando un qualche tipo di soluzione g C-], vim ti mostrerà l'elenco dei tag che corrispondono al nome. Dovrai comunque trovare la definizione corretta che stai cercando manualmente.
Hubert Kario,

15

Ero nella stessa situazione alcuni mesi fa ...

La mancanza di precisione di ctags è un dolore in un .., e trovo cscope molto meglio per tutte le cose relative alle macro (e ci sono un sacco di macro nel kernel di Linux) ..

per quanto riguarda l'uso, in realtà è semplice ... basta digitare cscope -R alla radice del kernel e quindi non c'è nulla di cui preoccuparsi .. (Voglio dire se vuoi solo esplorare è perfetto ...)

Quindi, le combinazioni di tasti si basano tutte su Ctrl- \ (puoi rimappare se sei allergico a Ctrl), usi principalmente s e g ....,

Sviluppando per il kernel, non mi serviva molto il completamento ...

Ad ogni modo, scegli cscope, questo è molto più conveniente, preciso.


4
<< basta digitare cscope -R alla radice del kernel .... Meglio digitare "make cscope" sotto il kernel, altrimenti finirai con tutte le architetture presenti nel kernel Linux e quindi la definizione multipla nello stesso simbolo C.
Kumar,

4

Hmm ... Probabilmente dovresti usare etags invece di ctags ...

Se usi cscope, puoi vedere le catene di chiamate, cioè chi chiama questa funzione e quali funzioni chiama questa funzione?

Non sono sicuro che questo possa essere fatto usando etags / ctags ...

Questa è solo una caratteristica ... che ne dite di scoprire il file che contiene una particolare definizione di funzione? Questo si ottiene solo in cscope.

Uso sia cscope che etags, sono entrambi utili per cose diverse, specialmente quando si lavora con una base di codice di grandi dimensioni, come il kernel Linux. In effetti, ho iniziato a usare cscope ed etags quando ho iniziato a lavorare con Linux Kernel / Xen.

LXR non è eccezionale, perché è necessario fare clic, andare sulla rete ecc., Mentre è possibile creare database cscope e tag sul codice del kernel e non è necessario passare sulla rete (a differenza di lxr).


Etags non è solo per emacs? Uso esclusivamente g / vim.
Robert S. Barnes,

Si hai ragione. Dalla pagina man: Il programma etags è usato per creare un file di tabella tag, in un formato compreso da emacs (1); il programma ctags è usato per creare una tabella simile in un formato compreso da vi (1).
rkk

1
credo che ci siano due gusti di etag e tag. Uno è l'emacs uno, l'altro è l'esuberante ctags uno. Il primo è stato scritto per la prima volta per emacs, ma può essere utilizzato anche per vi; il secondo è stato scritto per la prima volta per vi, ma può essere utilizzato anche per emacs. Trovo il secondo (esuberanti tag) più facile da usare, anche se sono un utente emacs. Se installi il pacchetto exuberant-ctags, i collegamenti ai binari etags / ctags cambieranno e rimanderanno a binari diversi.
ustun

1

Suggerisci di usare gtag globali. Potrebbe usare il plugin vim gen_tags per integrare gtags con vim.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.