Tag per Emacs: relazione tra etags, ebrowse, cscope, GNU Global e ctags esuberanti


102

Lavoro su progetti C ++ e ho esaminato la guida di Alex Ott a CEDET e altri thread sui tag in StackOverflow, ma sono ancora confuso su come Emacs si interfaccia con questi diversi sistemi di tag per facilitare il completamento automatico, la ricerca di definizioni, la navigazione dei sorgenti codice di base o l'anteprima di doc-string.

  1. Qual è la differenza (ad esempio, in termini di caratteristiche) tra etags, ebrowse, exuberant ctags, cscope, GNU Globale GTags? Cosa devo fare per usarli in Emacs ?

  2. Ho bisogno di semantic / senator (CEDET) se voglio usare i tag per navigare / completare automaticamente i simboli?

  3. Cosa porta la semantica in tavola oltre a queste diverse utilità di tag? Come si interfaccia con questi strumenti?


2
A giudicare dal tronco , il GTagsprogetto a cui ti sei collegato è quasi morto. Se qualcuno ne sta parlando gtags, probabilmente si sta riferendo a GNU Global.
Gordon Gustafson

Risposte:


71

Questa è una buona domanda che ho letto di recente qui, quindi cercherò di spiegare la differenza in modo più dettagliato:

Punto 1:

etagsed ctagsentrambi generano un file indice (noto anche come tag / TAGS) di oggetti linguaggio trovati nei file sorgente che consente a questi elementi di essere rapidamente e facilmente individuati da un editor di testo o da un'altra utilità. Un tag indica un oggetto linguaggio per il quale è disponibile una voce di indice (o, in alternativa, la voce di indice creata per quell'oggetto). I tag generati da ctags sono più ricchi in termini di metadati, ma Emacs non può comunque interpretare i dati aggiuntivi, quindi dovresti considerarli più o meno uguali (il vantaggio principale ctagssarebbe il supporto per più lingue). L'utilizzo principale dei file dei tag è la ricerca di classi / metodo / funzione / costanti / ecc., Dichiarazioni / definizioni.

cscopeè una bestia molto più potente (almeno per quanto riguarda C / C ++ e Java). Sebbene funzioni più o meno sullo stesso principio (generando un file di metadati utili) ti consente di fare alcune cose più elaborate come trovare tutti i riferimenti a un simbolo, vedere dove viene invocata una funzione, ecc (puoi trovare anche definizioni) .

Riassumendo:

ctagsuno ti permette di navigare alla dichiarazione / definizione dei simboli (quella che alcuni chiamerebbero una ricerca unidirezionale ). ctagsè uno strumento generico utile per molte lingue.

D'altra parte (come accennato nella pagina del progetto) cscopeti permette di:

  • Vai alla dichiarazione di un simbolo
  • Mostra un elenco selezionabile di tutti i riferimenti a un simbolo
  • Cerca qualsiasi definizione globale
  • Funzioni chiamate da una funzione
  • Funzioni che chiamano una funzione
  • Cerca una stringa di testo
  • Cerca un modello di espressione regolare
  • Trova un file
  • Trova tutti i file incluso un file

Non dovrebbe sorprendere nessuno a questo punto, che quando mi occupo di progetti C / C ++ ne faccio un uso pesante cscopee mi interessa molto poco ctags. Quando si tratta di altre lingue la situazione sarebbe ovviamente capovolta.

Punto 2.

Per avere un autocompletamento intelligente è necessario un vero parser del codice sorgente (come semantico), altrimenti non conoscerai i tipi di oggetti (ad esempio) nelle tue applicazioni e i metodi che possono essere invocati su di essi. Puoi avere un completamento automatico basato su molte fonti diverse, ma per ottenere i migliori risultati avrai bisogno di un parser. Lo stesso vale per l'evidenziazione della sintassi - attualmente l'evidenziazione della sintassi nelle modalità principali di Emacs si basa semplicemente su espressioni regolari ed è molto fragile e soggetta a errori. Si spera che con l'inclusione della semantica in Emacs 23.2 (prima era un pacchetto esterno) inizieremo a vederne più usi (come usarlo per analizzare un codice sorgente buffer per evidenziarlo correttamente)

Poiché la semantica di Emacs 24.1 è utilizzabile dal framework di completamento di Emacs. Il modo più semplice per testarlo è aprire un file di codice sorgente C e digitareM-TAB o C-M-ie osservare come la semantica si completa automaticamente per te. Per le lingue in cui la semantica non è abilitata per impostazione predefinita, puoi aggiungerla alla seguente riga all'hook in modalità principale preferito:

(add-to-list 'completion-at-point-functions 'semantic-completion-at-point-function)

Punto 3.

semantic porta una vera consapevolezza del codice (per i pochi linguaggi che attualmente supporta) e colma il divario tra IDE ed Emacs. Non si interfaccia con strumenti comeetags e cscope, ma non significa che non puoi usarli insieme.

Spero che le mie spiegazioni abbiano senso e ti siano utili.

PS Non conosco bene globale ebrowse, ma se la memoria mi serve hanno fatto uso di etags.


1
Questo è fantastico. Grazie! Sai come posso usare cscopein Emacs? Ho letto qualcosa xcscope.elsu EmacsWiki qui ma non sono riuscito a trovare un collegamento al file. Inoltre, quale .elfile usi per ottenere cscopecon Emacs?
Amelio Vazquez-Reina

1
xcscope.elsi trova in cscope/contrib/xcscope/(essendo questo nel pacchetto di distribuzione). È quello che uso io.
Bozhidar Batsov

Un'altra domanda: come si semanticconfronta con cscope? In termini di navigazione nel codice sorgente, semantic fornisce funzionalità che cscopenon lo fanno? Usi entrambi?
Amelio Vazquez-Reina

4
Non credo che GNU Global usi gli etags, btw. IIRC mantiene e interroga un database "appropriato" (invece di scansionare un file di testo semplice), che ha numerosi vantaggi in termini di prestazioni sia per le query che (soprattutto) per l'aggiornamento dei tag.
phils

@BozhidarBatsov Quando hai detto For languages where semantic is not enabled by default, you can add the following line to your major mode hook of choice ... <code>. Che cosa fa esattamente lo snippet di codice?
Amelio Vazquez-Reina

45

Cercherò di aggiungere alcune spiegazioni a 1.

Che cos'è?

  • Etags è un comando per generare il file "TAGS" che è il file di tag per Emacs. Puoi usare il file con etags.el che fa parte del pacchetto emacs.
  • Ctags è un comando per generare il file 'tag' che è il file tag per vi. Ora Exuberant Ctags può generare file "TAGS" con l'opzione -e e supportare 41 linguaggi di programmazione.
  • Cscope è uno strumento di esplorazione del codice sorgente all-in-one per il linguaggio C. Ha un proprio CUI (interfaccia utente a caratteri) e database di tag (cscope.in.out, cscope.out, cscope.po.out). Puoi usare cscope da Emacs usando xcscope.el che fa parte del pacchetto cscope.
  • GNU GLOBAL è un sistema di codifica del codice sorgente. Sebbene sia simile agli strumenti di cui sopra, differisce da loro al punto che dipende da qualsiasi editor e non ha un'interfaccia utente ad eccezione della riga di comando. Gtags è un comando per generare file di tag per GLOBAL (GTAGS, GRTAGS, GPATH). Puoi usare GLOBAL da emacs usando gtags.el che fa parte del pacchetto GLOBAL. Oltre a questo, ci sono molte librerie elisp per esso (xgtags.el, ggtags.el, anything-gtags.el, helm-gtags.el, ecc.).

Confronto

  • Ctags ed etags trattano solo le definizioni. Cscope e GNU GLOBAL trattano non solo le definizioni ma anche i riferimenti.
  • Ctags ed etags utilizzano un file di tag di testo piatto. Cscope e GNU GLOBAL utilizzano database di tag chiave-valore.
  • Cscope e GNU GLOBAL hanno un motore di ricerca simile a grep e funzionalità di aggiornamento incrementale dei file di tag.

Combinazione

È possibile combinare il ricco supporto linguistico di Exuberant Ctags e la struttura del database di GNU GLOBAL utilizzando ctags come parser plug-in di GLOBAL.

Prova quanto segue: (richiede GLOBAL-6.0, Exuberant Ctags-5.5 o versioni successive rispettivamente)

Costruire GNU GLOBAL:

$ ./configure --with-exuberant-ctags=/usr/local/bin/ctags
$ sudo make install

Uso:

$ export GTAGSCONF=/usr/local/share/gtags/gtags.conf
$ export GTAGSLABEL=ctags
$ gtags                     # invokes Exuberant Ctags internally
$ emacs -f gtags-mode       # load gtags.el

(Tuttavia, non puoi trattare i riferimenti con questo metodo, perché ctags non trattano i riferimenti.)

Puoi anche usare cscope come client di GNU GLOBAL. Il pacchetto GLOBAL include un comando chiamato 'gtags-cscope' che è un port di cscope, cioè è lo stesso cscope tranne per il fatto che usa GLOBAL come motore di ricerca invece di quello di cscope.

$ gtags-cscope          # this is GLOBAL version of cscope

Con le combinazioni, puoi usare cscope per 41 lingue.

In bocca al lupo!


1
Per gli utenti su Debian e derivati ​​come Ubuntu: la pagina web GNU GLOBAL avverte che i pacchetti .deb forniti con queste distribuzioni Linux sono datati e non dovrebbero essere usati. Nel mio caso GLOBAL era sulla versione 5.7.1 e non riuscivo a far funzionare correttamente gtags.el, ggtags.el o helm-gtags.el su Emacs 24. Compilando GNU GLOBAL 6.5 da zero, con supporto per Exuberant Ctags ( Ho usato 5.8) ha funzionato a meraviglia. (Grazie per gli ottimi suggerimenti, @shigio).
Rob

9

I file TAGS contengono definizioni

UN TAGS file contiene un elenco di dove vengono definite le funzioni e le classi. Di solito è posizionato nella radice di un progetto e ha questo aspetto:

^L
configure,3945
as_fn_success () { as_fn_return 0; }^?as_fn_success^A180,5465
as_fn_failure () { as_fn_return 1; }^?as_fn_failure^A181,5502
as_fn_ret_success () { return 0; }^?as_fn_ret_success^A182,5539
as_fn_ret_failure () { return 1; }^?as_fn_ret_failure^A183,5574

Ciò consente a Emacs di trovare le definizioni. La navigazione di base è integrata confind-tag , maetags-select fornisce un'interfaccia utente migliore quando ci sono più corrispondenze.

Puoi anche utilizzare file TAGS per il completamento del codice. Per esempio, il backend etags dell'azienda utilizza file TAGS .

I file TAGS possono essere creati da diversi strumenti

ctags(precedentemente noto come 'universal ctags' o 'exuberant ctags') può generare file TAGS e supporta la più ampia gamma di lingue. È mantenuto attivamente su GitHub.

Emacs viene fornito con due programmi che generano file TAGS, chiamati etagse ctags. Emacs' ctagsè solo etagscon la stessa interfaccia CLI ctags universali. Per evitare confusione, molte distribuzioni rinominano questi programmi (ad esempio ctags.emacs24su Debian).

Esistono anche strumenti specifici per la lingua per la generazione di file TAGS, come jsctagsehasktags .

Altri formati di file

ebrowseè un programma C fornito con Emacs. Indicizza il codice C / C ++ e genera un BROWSEfile. ebrowse.el fornisce la solita definizione e completamento della ricerca. Puoi anche aprire il fileBROWSE file direttamente in Emacs per avere una panoramica delle classi / funzioni definite in codebase.

GNU globale ha un proprio formato di database, che consiste in una GTAGS, GRTAGSe GPATHfile. Puoi generare questi file con l'estensionegtags comando, che analizza il codice C / C ++. Per altre lingue, GNU Global può leggere file generati da ctags universali.

GNU Global fornisce anche un'interfaccia CLI per porre domande più sofisticate, come "dove è menzionato questo simbolo?". Viene fornito con un pacchetto Emacs gtags.el, ma ggtags.el è anche popolare per accedere ai database GNU Global.

Cscope è simile nello spirito a GNU Global: analizza C / C ++ nel proprio formato di database. Può anche rispondere a domande come "trova tutti i chiamanti / chiamati di questa funzione".

Vedi anche questa discussione HN che confronta global e cscope .

Progetti client / server

rtags analizza e indicizza C / C ++ utilizzando un server persistente. Usa il parser clang, quindi gestisce molto bene il C ++. Viene fornito con un pacchetto Emacs per interrogare il server.

google-gtags era un progetto in cui un file TAGS di grandi dimensioni sarebbe stato archiviato su un server. Quando hai interrogato il server, questo forniva un sottoinsieme del file TAGS pertinente alla tua ricerca.

Semantica (CEDET)

Semantic è un pacchetto Emacs integrato che contiene un parser per C / C ++, quindi può anche trovare definizioni. Può anche importare dati da file TAGS, database csope e altre fonti. CEDET include anche funzionalità in stile IDE che utilizza questi dati, ad esempio la generazione di diagrammi UML di gerarchie di classi.


7

[risposta aggiornata da quella di shigio ]

Cercherò di aggiungere alcune spiegazioni alla parte 1 della domanda.

Che cos'è?

  1. Etags genera un TAGSfile che è il formato del file tag per Emacs . Puoi usare un file Etags conetags.el quale fa parte di Emacs.
  2. Ctagsè il termine generico per tutto ciò che può generare un tagsfile, che è il formato di file tag nativo per Vi. Universal Ctags (aka UCtags, precedentemente Exuberant Ctags) può anche generare Etags con l' -eopzione.
  3. Cscope è uno strumento di navigazione all-in-one codice sorgente per C (con minore supporto per C ++ e Java), con le proprie basi di dati di tag ( cscope.in.out, cscope.out, cscope.po.out) e TUI . Il supporto di Cscope è integrato in Vim; puoi usare Cscope da Emacs usando il pacchetto xcscope.el . Ci sono anche GUI basate su Cscope .
  4. GNU GLOBAL (aka Gtags) è ancora un altro sistema di codifica del codice sorgente (con differenze significative - vedere la sezione successiva), in quanto genera anche file di tag.

Confronto

  • Ctags ed Etags trattano solo le definizioni (di, ad esempio, variabili e funzioni). Anche Cscope e Gtags trattano i riferimenti.
  • I file di tag Ctags e Etags sono piatti . I file di tag Cscope e Gtags sono database di valori-chiave più potenti , che consentono (ad esempio) l'aggiornamento incrementale.
  • Cscope e Gtags hanno l'estensione grep motore di ricerca simile.
  • Ctags ha il supporto integrato per più lingue e formati di dati: vedere l' elenco corrente nel repository di parser Ctags universali . UCtags ha anche documentato come sviluppare il proprio parser .
  • Cscope e Gtags sono indipendenti dall'editor.
  • Gtags non fornisce una propria interfaccia utente, ma attualmente (ottobre 2016) può essere utilizzato da riga di comando (CLI), Emacs e parenti, Vi e parenti, less(cercapersone), Doxygen e qualsiasi browser web.
  • Gtags fornisce gtags.eltramite il pacchetto GLOBAL, ma ci sono anche molte altre estensioni elisp, tra cui xgtags.el, ggtags.el, anything-gtags.el, helm-gtags.el.

Combinazione

Puoi combinare il ricco supporto linguistico di Universal Ctags con la funzionalità di database di Gtags e numerose estensioni utilizzando Ctags come parser plug-in GLOBAL :

# build GNU GLOBAL
./configure --with-exuberant-ctags=/usr/local/bin/ctags
sudo make install

# use it
export GTAGSCONF=/usr/local/share/gtags/gtags.conf
export GTAGSLABEL=ctags
gtags                     # invokes Universal Ctags internally
emacs -f gtags-mode       # load gtags.el

Nota ancora che se usi Ctags come parser per i tuoi Gtag, perdi la capacità di trattare i riferimenti (ad esempio, l'utilizzo di variabili, chiamate di funzione) che Gtags fornirebbe altrimenti. In sostanza, scambi il tracciamento di riferimento di Gtags con il maggiore supporto linguistico integrato di Ctags.

È inoltre possibile utilizzare Cscope come un client di Gtags: gtags-cscope.

In bocca al lupo!


Ho letto: "Nota ancora che se usi Ctags come parser per i tuoi Gtag, perdi la capacità di trattare i riferimenti (ad es. Utilizzo di variabili, chiamate di funzione) che Gtags fornirebbe altrimenti. In sostanza, scambi il tracciamento dei riferimenti di Gtags con Il maggiore supporto linguistico integrato di Ctags. " È vero per i vecchi ctags forniti con Emacs, o è ancora vero per Universal Ctags? Inoltre, ho letto "combina il linguaggio ricco di Universal Ctag" ma nello snippet della shell utilizza --with-exuberant-ctags=...quando ora a partire dal 2019 c'è --with-universal-ctagsun'opzione. Dovrebbe essere cambiato in quest'ultimo?
bgoodr

3

In realtà non ho controllato, ma secondo il manuale CEDET ( http://www.randomsample.de/cedetdocs/common/cedet/CScope.html ):

semantic può utilizzare CScope come back-end per le ricerche nel database. Per abilitarlo, usa:

 (semanticdb-enable-cscope-databases)

Ciò consentirà l'uso di cscope per tutti i buffer C e C ++.

CScope verrà quindi utilizzato per le ricerche a livello di progetto come backup quando le ricerche di database semantiche preesistenti potrebbero non aver analizzato tutti i file.


1
Questo non sembra funzionare in Emacs 24.3.1, usando il vanilla CEDET 2.0 fornito con esso (nessun metodo semanticdb-enable-cscope-databases).
Rob
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.