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 blah
manuell 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.
make tags
im 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.cscopetag
(cst
), damit die Befehle:tag
undCTRL-]
zuerst cscope durchsuchen, dann Tagsg 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.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.
quelle
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).
quelle
Schlagen Sie vor, globale gtags zu verwenden. Könnte das vim-Plugin gen_tags verwenden, um gtags in vim zu integrieren.
quelle