it-swarm.com.de

cscope oder ctags, warum man eines über das andere wählt?

Ich verwende vim/gvim hauptsächlich als Editor und suche nach einer Kombination aus lxr (Linux Cross Reference) und entweder cscope oder ctags , um die Kernelquelle zu erkunden. Ich habe jedoch noch nie cscope oder ctags verwendet und möchte gerne wissen, warum man sich unter Berücksichtigung meines Einsatzes von vim als Haupteditor für eines entscheidet.

124

ctags ermöglicht zwei Funktionen: Sie können von Funktionsaufrufen zu ihren Definitionen und zur Omni-Vervollständigung wechseln. Die erste bedeutet, dass nach einem Aufruf einer Methode durch Drücken von g] oder CTRL-] die Stelle aufgerufen wird, an der die Methode definiert oder implementiert ist. Die zweite Funktion bedeutet, wenn Sie foo. oder foo-> eingeben und wenn foo eine Struktur ist, wird ein Popup-Menü mit Feldabschluss angezeigt.

cscope hat auch die erste Funktion - mit set cscopetag -, aber nicht die letzte. Cscope bietet jedoch zusätzlich die Möglichkeit, an jeden Ort zu springen, an dem eine Funktion aufgerufen wird.

Was das Springen um eine Codebasis betrifft, werden Sie mit ctags immer nur zu dem Ort geleitet, an dem die Funktion implementiert ist, wohingegen cscope Ihnen zeigt, wo auch eine Funktion aufgerufen wird.

Warum würdest du dich für eines entscheiden? Nun, ich benutze beides. ctags ist einfacher einzurichten, schneller zu laufen und wenn Sie nur in eine Richtung springen möchten, werden Ihnen weniger Linien angezeigt. Sie können einfach :!ctags -R . ausführen und g] funktioniert einfach. Es ermöglicht auch diese alles umfassende Sache.

Cscope eignet sich hervorragend für größere, unbekannte Codebasen. Das Setup ist schwierig, da cscope eine Datei mit einer Liste von Dateinamen benötigt, die analysiert werden sollen. 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 wie folgt 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, der mich interessiert, die Liste cscope.files und die Datenbank erstellt. Auf diese Weise kann ich ":! Cscope_gen.sh" ausführen, anstatt mich an alle Setup-Schritte zu erinnern.

Ich ordne die cscope-Suche in Strg-Raum x 2 mit diesem Snippet ein, der den anderen Wermutstropfen von cscope mildert:

nmap <[email protected]><[email protected]> :cs find s <C-R>=expand("<cword>")<CR><CR>

Es gibt dieses cscope_maps.vim-Plugin , das eine Reihe ähnlicher Bindungen aufbaut. Ich kann mich nie daran erinnern, was alle Optionen bedeuten, also bleibe ich im Strg-Raum.

Zusammenfassend lässt sich sagen: ctags ist einfacher einzurichten und funktioniert meistens ohne viel zu tun. Es ist auch für Omni-Complete unerlässlich. cscope bietet mehr Funktionen, wenn Sie eine große und meist unbekannte Codebasis unterhalten müssen, aber mehr Beinarbeit erfordert.

148
richq

Ich war vor einigen Monaten in derselben Situation ...

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

was die Verwendung angeht, ist das eigentlich unkompliziert ... tippen Sie einfach cscope -R an der Wurzel Ihres Kernels und dann müssen Sie sich keine Sorgen machen .. (Ich meine, wenn Sie nur erkunden wollen, ist das perfekt ...)

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

Bei der Entwicklung für den Kernel brauchte ich nicht so sehr die Fertigstellung ...

Wie auch immer, für cscope gehen, das ist viel bequemer, genauer.

14
LB40

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

Wenn Sie cscope verwenden, können Sie Anrufketten sehen, d. H. Wer ruft diese Funktion auf und welche Funktionen ruft diese Funktion auf? 

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

Das ist nur eine Funktion ... wie sieht es aus mit der Datei, die eine bestimmte Funktionsdefinition enthält? Das bekommst du nur in cscope.

Ich benutze beides cscope und etags, sie sind beide gut für verschiedene Dinge, besonders wenn Sie mit einer großen Codebase wie dem Linux-Kernel arbeiten. Tatsächlich begann ich mit cscope und etags, als ich mit Linux Kernel/Xen arbeitete.

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

4
rmk

Schlagen Sie die Verwendung globaler GTags vor. Könnte vim plugin gen_tags verwenden, um gtags mit vim zu integrieren.

0
Hongbo Liu