Tags für Emacs: Beziehung zwischen etags, ebrowse, cscope, GNU Global und üppigen ctags

102

Ich arbeite an C ++ - Projekten und habe Alex Ott's Handbuch zu CEDET und anderen Themen zu Tags in StackOverflow durchgesehen. Ich bin jedoch immer noch verwirrt darüber, wie Emacs mit diesen verschiedenen Tag-Systemen zusammenarbeitet, um die automatische Vervollständigung, das Nachschlagen von Definitionen und die Navigation der Quelle zu erleichtern Codebasis oder die Vorschau von Dokumentzeichenfolgen.

  1. Was ist der Unterschied (zB in Bezug auf die Funktionen) zwischen etags, ebrowse, exuberant ctags, cscope, GNU Globalund GTags? Was muss ich tun, um sie in Emacs zu verwenden ?

  2. Benötige ich Semantik / Senator (CEDET), wenn ich Tags zum Navigieren / automatischen Vervollständigen von Symbolen verwenden möchte?

  3. Was bringt die Semantik zusätzlich zu diesen verschiedenen Tag-Dienstprogrammen auf den Tisch? Wie ist die Schnittstelle zu diesen Tools?

Amelio Vazquez-Reina
quelle
2
Dem Kofferraum nach zu urteilen , ist das GTagsProjekt, mit dem Sie verbunden sind, ziemlich tot. Wenn jemand darüber spricht gtags, bezieht er sich wahrscheinlich auf GNU Global.
Gordon Gustafson

Antworten:

71

Das ist eine ebenso gute Frage, wie ich sie kürzlich hier gelesen habe. Deshalb werde ich versuchen, den Unterschied genauer zu erklären:

Punkt 1:

etagsund ctagsbeide generieren eine Indexdatei (auch bekannt als Tag / TAGS) von Sprachobjekten in Quelldateien, mit denen diese Elemente von einem Texteditor oder einem anderen Dienstprogramm schnell und einfach gefunden werden können. Ein Tag bezeichnet ein Sprachobjekt, für das ein Indexeintrag verfügbar ist (oder alternativ den für dieses Objekt erstellten Indexeintrag). Die von ctags generierten Tags sind in Bezug auf Metadaten umfangreicher, aber Emacs kann die zusätzlichen Daten sowieso nicht interpretieren. Sie sollten sie daher mehr oder weniger gleich betrachten (der Hauptvorteil ctagswäre die Unterstützung für mehr Sprachen). Die Hauptverwendung für die Tags-Dateien ist das Nachschlagen der Deklaration / Definitionen von Klasse / Methode / Funktion / Konstante / usw.

cscopeist ein viel mächtigeres Biest (zumindest was C / C ++ und Java betrifft). Während es mehr oder weniger nach dem gleichen Prinzip arbeitet (Generieren einer Datei mit nützlichen Metadaten), können Sie einige ausgefallenere Dinge tun, z. B. alle Verweise auf ein Symbol finden, sehen, wo eine Funktion aufgerufen wird usw. (Sie können auch Definitionen finden). .

Etwas zusammenfassen:

ctagsMit einer können Sie zu Symboldeklarationen / -definitionen navigieren (was manche als Einweg-Suche bezeichnen würden ). ctagsist ein Allzweckwerkzeug, das für viele Sprachen nützlich ist.

Auf der anderen Seite (wie auf der Projektseite erwähnt) cscopekönnen Sie:

  • Gehen Sie zur Deklaration eines Symbols
  • Zeigen Sie eine auswählbare Liste aller Verweise auf ein Symbol an
  • Suchen Sie nach einer globalen Definition
  • Von einer Funktion aufgerufene Funktionen
  • Funktionen, die eine Funktion aufrufen
  • Suchen Sie nach einer Textzeichenfolge
  • Suchen Sie nach einem Muster für reguläre Ausdrücke
  • Suchen Sie eine Datei
  • Finden Sie alle Dateien einschließlich einer Datei

Es sollte an dieser Stelle niemanden überraschen, dass ich bei der Arbeit mit C / C ++ - Projekten viel Gebrauch mache cscopeund mich sehr wenig darum kümmere ctags. Beim Umgang mit anderen Sprachen würde sich die Situation offensichtlich umkehren.

Punkt 2.

Für eine intelligente automatische Vervollständigung benötigen Sie einen echten Quellcode-Parser (wie Semantik), da Sie sonst die Arten der Objekte (zum Beispiel) in Ihren Anwendungen und die Methoden, die für sie aufgerufen werden können, nicht kennen. Sie können eine automatische Vervollständigung basierend auf vielen verschiedenen Quellen durchführen. Um jedoch die besten Ergebnisse zu erzielen, benötigen Sie letztendlich einen Parser. Gleiches gilt für die Syntaxhervorhebung - derzeit basiert die Syntaxhervorhebung in den Hauptmodi von Emacs einfach auf regulären Ausdrücken und ist sehr fragil und fehleranfällig. Mit der Aufnahme der Semantik in Emacs 23.2 (früher war es ein externes Paket) werden wir hoffentlich mehr Verwendungsmöglichkeiten dafür sehen (wie die Verwendung zur Analyse eines Pufferquellcodes, um ihn richtig hervorzuheben).

Da Emacs 24.1 Semantik aus dem Emacs Completion Framework verwendet werden kann. Der einfachste Weg, dies zu testen, besteht darin, eine C-Quellcodedatei zu öffnen und einzugeben M-TABoder zu C-M-ibeobachten, wie die Semantik für Sie automatisch abgeschlossen wird. Für Sprachen, in denen die Semantik nicht standardmäßig aktiviert ist, können Sie die folgende Zeile zu Ihrem bevorzugten Hauptmodus-Hook hinzufügen:

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

Punkt 3.

Semantik bringt echtes Code-Bewusstsein (für die wenigen Sprachen, die es derzeit unterstützt) und schließt die Lücke zwischen IDEs und Emacs. Es ist nicht wirklich mit Tools wie etagsund verbunden cscope, aber es bedeutet nicht, dass Sie sie nicht zusammen verwenden können.

Hoffentlich machen meine Erklärungen Sinn und werden Ihnen nützlich sein.

PS Ich bin nicht ganz vertraut mit globalund ebrowse, aber wenn mir das Gedächtnis dient, haben sie Etags verwendet.

Bozhidar Batsov
quelle
1
Das ist toll. Vielen Dank! Wissen Sie, wie ich cscopein Emacs verwenden kann? Ich habe hierxcscope.el im EmacsWiki darüber gelesen , aber ich konnte keinen Link zu der Datei finden. Welche .elDatei verwenden Sie für cscopeEmacs?
Amelio Vazquez-Reina
1
xcscope.elbefindet sich in cscope/contrib/xcscope/(dies ist im Distributionspaket enthalten). Das benutze ich.
Bozhidar Batsov
Noch eine Frage: Wie ist der semanticVergleich mit cscope? Bietet die Semantik beim Navigieren durch den Quellcode Funktionen, die cscopedies nicht tun? Benutzt du beides?
Amelio Vazquez-Reina
4
Ich glaube nicht, dass GNU Global übrigens Etags verwendet. IIRC verwaltet und fragt eine "richtige" Datenbank ab (anstatt eine flache Textdatei zu scannen), die zahlreiche Leistungsvorteile sowohl beim Abfragen als auch (insbesondere) beim Aktualisieren der Tags bietet.
Phils
@BozhidarBatsov Als du gesagt hast For languages where semantic is not enabled by default, you can add the following line to your major mode hook of choice ... <code>. Was genau macht dieses Code-Snippet?
Amelio Vazquez-Reina
45

Ich werde versuchen, 1 einige Erklärungen hinzuzufügen.

Was ist es?

  • Etags ist ein Befehl zum Generieren der 'TAGS'-Datei, der Tag-Datei für Emacs. Sie können die Datei mit etags.el verwenden, die Teil des emacs-Pakets ist.
  • Ctags ist ein Befehl zum Generieren einer 'Tags'-Datei, die die Tag-Datei für vi ist. Jetzt kann Exuberant Ctags mit der Option -e eine 'TAGS'-Datei generieren und 41 Programmiersprachen unterstützen.
  • Cscope ist ein All-in-One-Tool zum Durchsuchen des Quellcodes für die Sprache C. Es verfügt über eine eigene feine CUI (Zeichenbenutzeroberfläche) und Tag-Datenbanken (cscope.in.out, cscope.out, cscope.po.out). Sie können cscope von Emacs mit xcscope.el verwenden, das Teil des cscope-Pakets ist.
  • GNU GLOBAL ist ein Quellcode-Tagging-System. Obwohl es den obigen Tools ähnlich ist, unterscheidet es sich von ihnen darin, dass es von jedem Editor abhängig ist und keine Benutzeroberfläche außer der Befehlszeile hat. Gtags ist ein Befehl zum Generieren von Tag-Dateien für GLOBAL (GTAGS, GRTAGS, GPATH). Sie können GLOBAL aus Emacs mit gtags.el verwenden, das Teil des GLOBAL-Pakets ist. Darüber hinaus gibt es viele Elisp-Bibliotheken dafür (xgtags.el, ggtags.el, irgendetwas-gtags.el, helm-gtags.el usw.).

Vergleich

  • Ctags und Etags behandeln nur Definitionen. Cscope und GNU GLOBAL behandeln nicht nur Definitionen, sondern auch Referenzen.
  • Ctags und Etags verwenden eine flache Text-Tag-Datei. Cscope und GNU GLOBAL verwenden Schlüsselwert-Tag-Datenbanken.
  • Cscope und GNU GLOBAL haben eine grep-ähnliche Suchmaschine und eine inkrementelle Aktualisierungsfunktion für Tag-Dateien.

Kombination

Sie können die umfassende Sprachunterstützung von Exuberant Ctags und die Datenbankfunktion von GNU GLOBAL kombinieren, indem Sie ctags als Plug-In-Parser von GLOBAL verwenden.

Versuchen Sie Folgendes: (erfordert GLOBAL-6.0, Exuberant Ctags-5.5 oder höher)

Gebäude GNU GLOBAL:

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

Verwendung:

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

(Sie können Referenzen jedoch nicht mit dieser Methode behandeln, da ctags keine Referenzen behandeln.)

Sie können cscope auch als Client von GNU GLOBAL verwenden. Das GLOBAL-Paket enthält einen Befehl mit dem Namen 'gtags-cscope', der ein Port von cscope ist, dh es ist cscope selbst, außer dass GLOBAL als Suchmaschine anstelle von cscope verwendet wird.

$ gtags-cscope          # this is GLOBAL version of cscope

Mit den Kombinationen können Sie cscope für 41 Sprachen verwenden.

Viel Glück!

Shigio
quelle
1
Für Benutzer unter Debian und Derivaten wie Ubuntu: Die GNU GLOBAL-Webseite warnt davor, dass die mit diesen Linux-Distributionen gelieferten .deb-Pakete veraltet sind und nicht verwendet werden sollten. In meinem Fall war GLOBAL in Version 5.7.1 und ich konnte gtags.el, ggtags.el oder helm-gtags.el nicht dazu bringen, unter Emacs 24 ordnungsgemäß zu funktionieren. Kompilieren von GNU GLOBAL 6.5 von Grund auf mit Unterstützung für Exuberant Ctags ( Ich habe 5.8) einen Leckerbissen gemacht. (Danke für die hervorragenden Hinweise, @shigio).
Rob
9

TAGS-Dateien enthalten Definitionen

Eine TAGSDatei enthält eine Liste, in der Funktionen und Klassen definiert sind. Es befindet sich normalerweise im Stammverzeichnis eines Projekts und sieht folgendermaßen aus:

^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

Dadurch kann Emacs Definitionen finden. Die grundlegende Navigation ist in integriert find-tag, etags-selectbietet jedoch eine schönere Benutzeroberfläche, wenn mehrere Übereinstimmungen vorhanden sind.

Sie können auch TAGS-Dateien zur Code-Vervollständigung verwenden. Zum Beispiel Backend etags des Unternehmens verwendet Tags Dateien .

TAGS-Dateien können mit verschiedenen Tools erstellt werden

ctags(früher als "universelle ctags" oder "üppige ctags" bekannt) kann TAGS-Dateien generieren und unterstützt die unterschiedlichsten Sprachen. Es wird aktiv auf Github gepflegt.

Emacs wird mit zwei Programmen geliefert, die TAGS-Dateien generieren, etagsund ctags. Emacs ctagshat nur etagsdie gleiche CLI-Schnittstelle wie universelle ctags. Um Verwirrung zu vermeiden, benennen viele Distributionen diese Programme um (z ctags.emacs24. B. unter Debian).

Es gibt auch sprachspezifische Tools zum Generieren von TAGS-Dateien wie jsctagsund hasktags.

Andere Dateiformate

ebrowseist ein C-Programm, das mit Emacs geliefert wird. Es indiziert C / C ++ - Code und generiert eine BROWSEDatei. ebrowse.el bietet die übliche Suchdefinition und -vervollständigung. Sie können die BROWSEDatei auch direkt in Emacs öffnen , um einen Überblick über die Klassen / Funktionen zu erhalten, die in einer Codebasis definiert sind.

GNU Globale hat seine eigene Datenbank - Format, das eine besteht aus GTAGS, GRTAGSund GPATHDatei. Sie können diese Dateien mit dem gtagsBefehl generieren , der C / C ++ - Code analysiert. Für andere Sprachen kann GNU Global Dateien lesen, die von universellen ctags generiert wurden.

GNU Global bietet auch eine CLI-Schnittstelle zum Stellen komplexerer Fragen, z. B. "Wo wird dieses Symbol erwähnt?". Es wird mit einem Emacs-Paket gtags.el geliefert, aber ggtags.el ist auch für den Zugriff auf GNU Global-Datenbanken beliebt.

Cscope ähnelt im Geiste GNU Global: Es analysiert C / C ++ in ein eigenes Datenbankformat. Es kann auch Fragen wie "Alle Anrufer / Anrufer dieser Funktion finden" beantworten.

Siehe auch diese HN-Diskussion zum Vergleich von Global und Cscope .

Client / Server-Projekte

rtags analysiert und indiziert C / C ++ unter Verwendung eines persistenten Servers. Es verwendet den Clang-Parser, sodass C ++ sehr gut funktioniert. Es wird mit einem Emacs-Paket geliefert, mit dem der Server abgefragt werden kann.

google-gtags war ein Projekt, bei dem eine große TAGS-Datei auf einem Server gespeichert wurde. Wenn Sie den Server abfragen, wird eine Teilmenge der TAGS-Datei bereitgestellt, die für Ihre Suche relevant ist.

Semantik (CEDET)

Semantic ist ein integriertes Emacs-Paket, das einen Parser für C / C ++ enthält, sodass auch Definitionen gefunden werden können. Es kann auch Daten aus TAGS-Dateien, csope-Datenbanken und anderen Quellen importieren. CEDET enthält auch Funktionen im IDE-Stil, die diese Daten verwenden, z. B. das Generieren von UML-Diagrammen von Klassenhierarchien.

Wilfred Hughes
quelle
7

[Antwort von Shigio aktualisiert ]

Ich werde versuchen, Teil 1 der Frage einige Erklärungen hinzuzufügen.

Was ist es?

  1. Etags generiert eine TAGSDatei, die das Tag-Dateiformat für Emacs ist . Sie können eine Etags-Datei verwenden, mit etags.elder Emacs Teil ist.
  2. Ctagsist der Oberbegriff für alles, was eine tagsDatei generieren kann. Dies ist das native Tag-Dateiformat für Vi. Universal Ctags (auch bekannt UCtagsals Exuberant Ctags) können mit dieser -eOption auch Etags generieren .
  3. Cscope ist ein all-in-one - Quellcode - Browsing - Tool für C (mit geringerer Unterstützung für C ++ und Java), mit seinen eigenen Tag - Datenbanken ( cscope.in.out, cscope.out, cscope.po.out) und TUI . Die Cscope-Unterstützung ist in Vim integriert. Sie können Cscope von Emacs mit dem Paket xcscope.el verwenden . Es gibt auch Cscope-basierte GUIs .
  4. GNU GLOBAL (aka Gtags) ist ein weiteres Quellcode-Tagging-System (mit signifikanten Unterschieden - siehe nächster Abschnitt), da es auch Tag-Dateien generiert.

Vergleich

  • Ctags und Etags behandeln nur Definitionen (z. B. von Variablen und Funktionen). Cscope und Gtags behandeln auch Referenzen.
  • Ctags- und Etags-Tag-Dateien sind flach . Cscope- und Gtags-Tagdateien sind leistungsfähigere Schlüsselwertdatenbanken , die (z. B.) inkrementelle Aktualisierungen ermöglichen.
  • Cscope und Gtags haben eine grepähnliche Suchmaschine.
  • Ctags bietet integrierte Unterstützung für weitere Sprachen und Datenformate: Weitere Informationen finden Sie in der aktuellen Liste der Universal Ctags-Parser im Repository . UCtags hat auch dokumentiert, wie Sie Ihren eigenen Parser entwickeln .
  • Cscope und Gtags sind editorunabhängig.
  • Gtags bietet keine eigene Benutzeroberfläche, kann jedoch derzeit (Oktober 2016) über die Befehlszeile (CLI), Emacs und Verwandte, Vi und Verwandte less(Pager), Doxygen und jeden Webbrowser verwendet werden.
  • Gtags bietet gtags.elüber das GLOBAL-Paket, aber es gibt auch viele andere Elisp-Erweiterungen, einschließlich xgtags.el, ggtags.el, irgendetwas-gtags.el, helm-gtags.el.

Kombination

Sie können die umfassende Sprachunterstützung von Universal Ctags mit der Datenbankfunktion von Gtags und zahlreichen Erweiterungen kombinieren, indem Sie Ctags als GLOBAL-Plug-In-Parser verwenden :

# 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

Beachten Sie erneut, dass Sie, wenn Sie Ctags als Parser für Ihre Gtags verwenden, nicht mehr in der Lage sind, Referenzen (z. B. variable Verwendung, Funktionsaufrufe) zu behandeln, die Gtags sonst bereitstellen würden. Im Wesentlichen tauschen Sie das Referenz-Tracking von Gtags gegen die bessere integrierte Sprachunterstützung von Ctags aus.

Sie können Cscope auch als Client von Gtags verwenden : gtags-cscope.

Viel Glück!

TomRoche
quelle
Ich las: "Beachten Sie erneut, dass Sie, wenn Sie Ctags als Parser für Ihre Gtags verwenden, nicht mehr in der Lage sind, Referenzen (z. B. variable Verwendung, Funktionsaufrufe) zu behandeln, die Gtags sonst bereitstellen würden. Im Wesentlichen tauschen Sie die Referenzverfolgung von Gtags gegen aus Die größere integrierte Sprachunterstützung von Ctags. " Gilt das für die alten mit Emacs gelieferten ctags oder gilt dies immer noch für Universal Ctags? Ich habe auch "Kombiniere die reichhaltige Sprache von Universal Ctag" gelesen, aber im Shell-Snippet wird es verwendet, --with-exuberant-ctags=...wenn es ab 2019 eine --with-universal-ctagsOption gibt. Sollte das auf Letzteres geändert werden?
Bgoodr
3

Ich habe es nicht überprüft, aber laut CEDET-Handbuch ( http://www.randomsample.de/cedetdocs/common/cedet/CScope.html ):

Semantic kann CScope als Backend für Datenbanksuchen verwenden. Verwenden Sie zum Aktivieren Folgendes:

 (semanticdb-enable-cscope-databases)

Dies ermöglicht die Verwendung von cscope für alle C- und C ++ - Puffer.

CScope wird dann für projektweite Suchvorgänge als Backup verwendet, wenn bei bereits vorhandenen semantischen Datenbanksuchen möglicherweise nicht alle Ihre Dateien analysiert wurden.

Clément B.
quelle
1
Dies scheint in Emacs 24.3.1 mit dem mitgelieferten Vanilla CEDET 2.0 nicht zu funktionieren (keine semanticdb-enable-cscope-database-Methode).
Rob