cscope oder ctags warum eins über das andere wählen? [geschlossen]

130

Ich verwende hauptsächlich vim / gvim als Editor und möchte eine Kombination aus lxr (dem Linux- Querverweis ) und entweder cscope oder ctags verwenden, um die Kernelquelle zu erkunden. Ich habe jedoch weder cscope noch ctags verwendet und würde gerne erfahren , warum man unter Berücksichtigung meiner Verwendung von vim als primärer Editor eines über das andere wählen könnte.

Robert S. Barnes
quelle

Antworten:

156

ctags aktiviert zwei Funktionen: Sie können von Funktionsaufrufen zu ihren Definitionen springen und die Omni-Vervollständigung. Das erste bedeutet, dass Sie bei einem Aufruf einer Methode die Stelle treffen g]oder CTRL-]an die Stelle springen, an der diese Methode definiert oder implementiert ist. Die zweite Funktion bedeutet, dass beim Eingeben von foo.oder foo->und wenn foo eine Struktur ist, ein Popup-Menü mit Feldvervollständigung angezeigt wird.

cscope hat auch die erste Funktion - using set cscopetag- aber nicht die letzte. Cscope bietet jedoch zusätzlich die Möglichkeit, zu allen Stellen zu springen, an denen auch eine Funktion aufgerufen wird.

Wenn Sie in einer Codebasis herumspringen, führen Sie ctags immer nur zu dem Ort, an dem die Funktion implementiert ist, während cscope Ihnen zeigen kann, wo auch eine Funktion aufgerufen wird.

Warum sollten Sie einen über den anderen wählen? Nun, ich benutze beide. ctags ist einfacher einzurichten, schneller auszuführen und wenn Sie nur in eine Richtung springen möchten, werden weniger Linien angezeigt. Sie können einfach laufen :!ctags -R .und g]funktioniert einfach. Es ermöglicht auch diese omni vollständige Sache.

Cscope eignet sich hervorragend für größere, unbekannte Codebasen. Das Einrichten ist schwierig, da cscope eine Datei benötigt, die eine Liste der Namen der zu analysierenden Dateien enthält. Auch in vim sind standardmäßig keine Tastenkombinationen eingerichtet - Sie müssen :cscope blah blahmanuell ausführen .

Um das erste Problem zu lösen, habe ich ein Bash-Skript cscope_gen.sh, das so aussieht:

#!/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

Dadurch wird nach Code gesucht, an dem ich interessiert bin, die Liste cscope.files erstellt und die Datenbank erstellt. Auf diese Weise kann ich ":! Cscope_gen.sh" ausführen, anstatt mich an alle Einrichtungsschritte erinnern zu müssen.

Ich ordne die cscope-Suche mit diesem Snippet dem Strg-Raum x 2 zu, wodurch der andere Wermutstropfen von cscope gemildert wird:

nmap <C-@><C-@> :cs find s <C-R>=expand("<cword>")<CR><CR>

Es gibt dieses Plugin cscope_maps.vim , das eine Reihe ähnlicher Bindungen erstellt. Ich kann mich nie erinnern, was alle Optionen bedeuten, also bleibe ich eher bei Strg-Leertaste.

Fazit: ctags sind einfacher einzurichten und funktionieren meistens ohne viel anderes. Es ist auch für omni-complete von entscheidender Bedeutung. cscope bietet mehr Funktionen, wenn Sie eine große und meist unbekannte Codebasis pflegen müssen, aber mehr Beinarbeit erfordern.

richq
quelle
2
Gibt es eine Möglichkeit, ctags genauer zu machen? Ich habe make tagsim Kernel-Root-Verzeichnis gespielt und mit dem Herumspringen gespielt und bin die meiste Zeit am falschen Ort gelandet. Ich habe gelesen, dass ctags Probleme mit dem c-Präprozessor hat, aber wenn man bedenkt, dass ctags in lxr verwendet wird, muss offensichtlich etwas getan werden können.
Robert S. Barnes
2
Wenn es Deep Macro Voodoo gibt, werden ctags wahrscheinlich fehlschlagen :-( Ich benutze es hauptsächlich für C ++ - Sachen, die weniger auf dieser Seite der Dinge beruhen (obwohl das seine eigenen Probleme hat ...)
richq
12
set cscopetag( cst), damit die Befehle :tagund CTRL-]zuerst cscope durchsuchen, dann Tags
Hasturkun
1
Außerdem ist ctags bei der rekursiven Suche ziemlich langsam. Die Verwendung von "ctags -L cscope.files" beschleunigt die Tag-Generierung erheblich.
Aaron H.
1
@ RobertS.Barnes Eine Lösung wird verwendet g C-]. Vim zeigt Ihnen die Liste der Tags, die dem Namen entsprechen. Sie müssen immer noch die richtige Definition finden, nach der Sie manuell suchen.
Hubert Kario
15

Ich war vor einigen Monaten in der gleichen Situation ...

Die mangelnde Präzision von ctags ist ein Schmerz in einem .., und ich finde cscope viel besser für alle Makros verwandten Sachen (und es gibt eine Reihe von Makros im Linux-Kernel) ..

Was die Verwendung betrifft, ist das eigentlich unkompliziert ... Sie geben einfach cscope -R im Stammverzeichnis Ihres Kernels ein und müssen sich dann keine Sorgen mehr machen. (Ich meine, wenn Sie nur erkunden möchten, ist das perfekt ...)

Dann basieren die Tastenkombinationen alle auf Strg- \ (Sie können es neu zuordnen, wenn Sie allergisch gegen Strg sind). Sie verwenden hauptsächlich s und g ....,

Als ich mich für den Kernel entwickelte, brauchte ich nicht so sehr die Fertigstellung ....

Wie auch immer, entscheiden Sie sich für cscope, dies ist viel bequemer und genauer.

LB40
quelle
4
<< Sie geben einfach cscope -R im Stammverzeichnis Ihres Kernels ein .... Geben Sie besser "make cscope" unter den Kernel ein, da sonst alle im Linux-Kernel vorhandenen Architekturen und damit mehrere Definitionen für dasselbe C-Symbol vorhanden sind.
Kumar
4

Hmm ... Sie sollten wahrscheinlich etags anstelle von ctags verwenden ...

Wenn Sie cscope verwenden, können Sie Aufrufketten sehen, dh wer ruft diese Funktion auf und welche Funktionen ruft diese Funktion auf?

Ich bin mir nicht sicher, ob dies mit etags / ctags möglich ist ...

Das ist nur eine Funktion ... wie wäre es, die Datei herauszufinden, die eine bestimmte Funktionsdefinition enthält? Dies erhalten Sie nur in cscope.

Ich benutze beide cscope als auch etags. eignen sich für verschiedene Zwecke, insbesondere wenn Sie mit einer großen Codebasis wie dem Linux-Kernel arbeiten. Tatsächlich habe ich angefangen, cscope und etags zu verwenden, als ich anfing, mit dem Linux-Kernel / Xen zu arbeiten.

LXR ist nicht großartig, da Sie klicken, über das Netzwerk usw. gehen müssen, während Sie die cscope- und tag-Datenbanken auf Ihrem Kernel-Code erstellen können und nicht über das Netzwerk gehen müssen (im Gegensatz zu lxr).

rmk
quelle
Ist etags nicht nur für Emacs? Ich benutze ausschließlich g / vim.
Robert S. Barnes
Ja, du hast recht. Über die Manpage: Mit dem Programm etags wird eine Tag-Tabellendatei in einem von emacs (1) verstandenen Format erstellt. Das Programm ctags wird verwendet, um eine ähnliche Tabelle in einem von vi (1) verstandenen Format zu erstellen.
rmk
1
Ich glaube, es gibt zwei Arten von Etags und Ctags. Einer ist der Emacs, der andere ist der üppige Ctags. Das erste wurde zuerst für Emacs geschrieben, kann aber auch für vi verwendet werden; Der zweite wurde zuerst für vi geschrieben, kann aber auch für Emacs verwendet werden. Ich finde das zweite (üppige ctags) einfacher zu bedienen, obwohl ich ein Emacs-Benutzer bin. Wenn Sie das exuberant-ctags-Paket installieren, ändern sich die Links zu etags / ctags-Binärdateien und verweisen auf verschiedene Binärdateien.
Ustun
1

Schlagen Sie vor, globale gtags zu verwenden. Könnte das vim-Plugin gen_tags verwenden, um gtags in vim zu integrieren.

Hongbo Liu
quelle