2013-05-19 19 views
5

Angenommen, ich eine Codeverzeichnisstruktur wie folgt:Wie kann ich Ctags in einer großen Codebasis ausführen?

/top 
    /second 
     /core 
      a.pl 
      b.pl 
      c.pl 
     /common 
      d.pl 
      e.pl 
     /util 
      f.pl 
      g.pl 
      h.pl  

Wo soll ich die ctags so laufen, dass ich zu Funktionsdefinitionen über vi springen können?

Zum Beispiel hatte ich:

/dir 
    /perl 
     a.pl 

und ich laufe in dir der Befehl ctags -R perl aber in a.pl konnte ich nicht auf eine Funktionsdefinition springen, die in der gleichen Datei existiert.
Wenn ich ctags -R .innerhalb das Verzeichnis tat, funktionierte es.

So kann ich das Muster nicht verstehen. Sollte ich ctags in core, common,util ausführen? Was ist, wenn meine Codebasis riesig ist? Würde ich es wirklich in jedem Verzeichnis ausführen müssen?

+0

Welche Ctags werden ausgeführt? Wenn Sie Exuberant Ctags ausführen, haben sie eine [FAQ zu genau diesem Thema] (http://ctags.sourceforge.net/faq.html#15). – msw

+0

Da Sie Ctags in Vim verwenden, empfehle ich Ihnen, sich nicht mit Ctags manuell zu befassen, sondern das Indexer-Plugin (http://goo.gl/lNrB5) zu verwenden, das mühelos Tags für das gesamte Projekt generiert und Tags hochhält -Datum. Sie können auch meine Antwort auf diese Frage http://goo.gl/dMavX für ein bisschen mehr Details überprüfen. –

+0

@msw: Ich weiß nicht.Das in Cygwin installiert.Wie überprüfe ich das? – Cratylus

Antwort

4

Normalerweise würden Sie nur eine tags Datei im Stammverzeichnis Ihres Projekts verwenden.

Um beispielsweise den gesamten Quellcode von Vim zu markieren, der sich in ~/src/vim-7.3 befindet, navigieren Sie zu diesem Verzeichnis und generieren dort die Tag-Datei.

$ cd ~/src/vim-7.3 
$ ctags -R 

Das ist alles.

Sie können das gleiche von innen Vim natürlich tun. Starten Sie Vim und geben Sie dann:

:cd ~/src/vim-7.3 
:!ctags -R 

Überprüfen Sie, ob Sie die richtige 'tags' Einstellung haben. Der Standardwert ist ./tags,tags, was bedeutet, dass Vim im aktuellen Verzeichnis nach einer tags Datei sucht.

Lesen Sie unbedingt :h 'tags' in seiner Gesamtheit. Sie können Vim anweisen, tief in der Verzeichnisstruktur nach tags Dateien zu suchen, indem Sie Muster mit Platzhaltern angeben.

Noch eine Sache: Damit dieser Ansatz funktioniert, muss das aktuelle Arbeitsverzeichnis von Vim immer im Stammverzeichnis stehen. Wenn Sie eine Option wie 'autochdir' eingestellt haben oder ständig selbst Verzeichnisse wechseln, dann wird die tags offensichtlich nicht gefunden.

+0

Wenn ich '' h 'Tags'' gebe, erhalte ich: 'E433: Keine Tags Datei E149: Sorry, keine Hilfe für' Tags ' Drücken Sie ENTER oder geben Sie den Befehl ein, um fortzufahren ' – Cratylus

+0

@Cratylus Das klingt, als hätten Sie ein ernsthaftes Problem mit Ihren Laufzeitdateien. Funktioniert ': help' überhaupt? – glts

+0

Wenn ich 'Typ: help' erhalte ich:' E433: Keine Tags Datei E149: Sorry, keine Hilfe für help.txt Drücken Sie die Eingabetaste oder geben Sie Befehl ' – Cratylus

6

Ihre tags Datei sollte im ersten gemeinsamen Vorfahren Ihres Codes (das wäre in Ihrem Fall second) mit $ ctags -R . generiert werden.

Ich würde vorschlagen, dass Sie diese Zeile in ~/.vimrc hinzufügen, um immer zu machen Vim Ihre tags Datei finden, egal wo Sie in Ihrem Projekt sind und egal, was das „aktuelle Verzeichnis“ ist:

set tags=./tags;/,tags;/ 

Es funktioniert wie das in @ glts's Antwort mit einem interessanten Twist: wegen der ;/ Teil, Vim sucht nach oben und bis / für eine tags Datei. Angenommen, Sie bearbeiten g.pl, wird Vim Ihre tags Datei in second korrekt verwenden.

:h tags 
:h ctags 
+0

Schöne Vermutung mit dem ', /' aber es funktioniert nicht so in Vim. Es gibt leider keinen Verzeichnisbaum. Und Sie können "Ctags -R" auch "Ctags -R" verwenden! – glts

+0

Es ist '; /' nicht ', /' (das '/' ist nicht erforderlich, aber expliziter, also behalte ich es hier) und ja, es funktioniert so. Siehe ': h Datei-Suche', speziell den" Aufwärtssuch-Teil ". – romainl

+0

Oh, richtig, ich stehe korrigiert. Ordentlich. – glts