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.