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.
Was ist der Unterschied (zB in Bezug auf die Funktionen) zwischen
etags
,ebrowse
,exuberant ctags
,cscope
,GNU Global
undGTags
? Was muss ich tun, um sie in Emacs zu verwenden ?Benötige ich Semantik / Senator (CEDET), wenn ich Tags zum Navigieren / automatischen Vervollständigen von Symbolen verwenden möchte?
Was bringt die Semantik zusätzlich zu diesen verschiedenen Tag-Dienstprogrammen auf den Tisch? Wie ist die Schnittstelle zu diesen Tools?
quelle
GTags
Projekt, mit dem Sie verbunden sind, ziemlich tot. Wenn jemand darüber sprichtgtags
, bezieht er sich wahrscheinlich auf GNU Global.Antworten:
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:
etags
undctags
beide 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 Hauptvorteilctags
wä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.cscope
ist 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:
ctags
Mit einer können Sie zu Symboldeklarationen / -definitionen navigieren (was manche als Einweg-Suche bezeichnen würden ).ctags
ist ein Allzweckwerkzeug, das für viele Sprachen nützlich ist.Auf der anderen Seite (wie auf der Projektseite erwähnt)
cscope
können Sie:Es sollte an dieser Stelle niemanden überraschen, dass ich bei der Arbeit mit C / C ++ - Projekten viel Gebrauch mache
cscope
und mich sehr wenig darum kümmerectags
. 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:
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
etags
und verbundencscope
, 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
global
undebrowse
, aber wenn mir das Gedächtnis dient, haben sie Etags verwendet.quelle
cscope
in Emacs verwenden kann? Ich habe hierxcscope.el
im EmacsWiki darüber gelesen , aber ich konnte keinen Link zu der Datei finden. Welche.el
Datei verwenden Sie fürcscope
Emacs?xcscope.el
befindet sich incscope/contrib/xcscope/
(dies ist im Distributionspaket enthalten). Das benutze ich.semantic
Vergleich mitcscope
? Bietet die Semantik beim Navigieren durch den Quellcode Funktionen, diecscope
dies nicht tun? Benutzt du beides?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?Ich werde versuchen, 1 einige Erklärungen hinzuzufügen.
Was ist es?
Vergleich
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:
Verwendung:
(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.
Mit den Kombinationen können Sie cscope für 41 Sprachen verwenden.
Viel Glück!
quelle
TAGS-Dateien enthalten Definitionen
Eine
TAGS
Datei enthält eine Liste, in der Funktionen und Klassen definiert sind. Es befindet sich normalerweise im Stammverzeichnis eines Projekts und sieht folgendermaßen aus:Dadurch kann Emacs Definitionen finden. Die grundlegende Navigation ist in integriert
find-tag
,etags-select
bietet 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,
etags
undctags
. Emacsctags
hat nuretags
die gleiche CLI-Schnittstelle wie universelle ctags. Um Verwirrung zu vermeiden, benennen viele Distributionen diese Programme um (zctags.emacs24
. B. unter Debian).Es gibt auch sprachspezifische Tools zum Generieren von TAGS-Dateien wie
jsctags
undhasktags
.Andere Dateiformate
ebrowse
ist ein C-Programm, das mit Emacs geliefert wird. Es indiziert C / C ++ - Code und generiert eineBROWSE
Datei. ebrowse.el bietet die übliche Suchdefinition und -vervollständigung. Sie können dieBROWSE
Datei 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
,GRTAGS
undGPATH
Datei. Sie können diese Dateien mit demgtags
Befehl 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.
quelle
[Antwort von Shigio aktualisiert ]
Ich werde versuchen, Teil 1 der Frage einige Erklärungen hinzuzufügen.
Was ist es?
TAGS
Datei, die das Tag-Dateiformat für Emacs ist . Sie können eine Etags-Datei verwenden, mitetags.el
der Emacs Teil ist.Ctags
ist der Oberbegriff für alles, was einetags
Datei generieren kann. Dies ist das native Tag-Dateiformat für Vi. Universal Ctags (auch bekanntUCtags
als Exuberant Ctags) können mit dieser-e
Option auch Etags generieren .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 .Gtags
) ist ein weiteres Quellcode-Tagging-System (mit signifikanten Unterschieden - siehe nächster Abschnitt), da es auch Tag-Dateien generiert.Vergleich
grep
ähnliche Suchmaschine.less
(Pager), Doxygen und jeden Webbrowser verwendet werden.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 :
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!
quelle
--with-exuberant-ctags=...
wenn es ab 2019 eine--with-universal-ctags
Option gibt. Sollte das auf Letzteres geändert werden?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:
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.
quelle