So navigieren Sie in einem großen Projekt in VIM

86

Wie verwalten Sie große Projekte (Hunderte von Dateien) nur mit VIM?

Ich persönlich habe Probleme bei größeren als kleinen Projekten.

  • Gibt es eine Möglichkeit, schnell zur Datei zu gehen, vorzugsweise mit Namensvervollständigung?
  • Gleiches gilt für 'Zur Klassendefinition gehen', wenn es sich in einer anderen Datei befindet

Ich kenne alle VIM-Grundlagen, daher habe ich keine Probleme damit, Skripte zu schreiben oder Quellcode schnell zu bearbeiten. Aber es wird wirklich chaotisch für mich, wenn ich zwischen Dateien navigieren muss.

Jakub Arnold
quelle
Welche Sprache benutzt du?
LB40
Ich würde eine sprachunabhängige Lösung bevorzugen, aber ich brauche Unterstützung für C ++, PHP und Rails.
Jakub Arnold
Welche Antwort haben Sie akzeptiert? @ JakubArnold
@ Xetrasu Ich endete mitNERDTree
Jakub Arnold

Antworten:

33

VIM bietet hervorragende Unterstützung für Tags . Nachdem Sie eine Tag-Datei für Ihr Projekt erstellt haben, können Sie innerhalb derselben Bearbeitungssitzung zu einer Definition oder Deklaration einer Methode, Klasse usw. springen, einschließlich des Überspringens von Dateien.

Versuchen

:help tags

Um eine Tag-Datei für C / C ++ zu generieren, gehen Sie zu Ihrer Shell-Eingabeaufforderung (ich gehe davon aus, dass Ihr System * nix / Cygwin ist) und geben Sie ein

info ctags

oder

ctags --help
System PAUSE
quelle
2
Vim unterstützt auch cscope, mit dem Sie beispielsweise herausfinden können, welche Funktionen eine bestimmte Funktion aufrufen - siehe :help cscopeInformationen. In der Einleitung gibt es eine nette Funktionsliste (unter "Es wurde entwickelt, um Fragen wie zu beantworten").
Cascabel
1
Leider hat cscope ein sehr begrenztes Verständnis von C ++.
Luc Hermitte
28

Ich mag einfache Lösungen. Meine derzeitige Lieblingsnavigationsmethode ist:

Hinzufügen ~/.vimrc.local

set path=$PWD/**

Geben Sie dies dann in den Editor ein, um die Datei an einer beliebigen Stelle im aktuellen Arbeitsverzeichnis (pwd) zu finden.

:find user_spec.rb

Sie können die Tab-Vervollständigung für die Dateinamen verwenden, um auch mehrere Auswahlmöglichkeiten zu finden, was diese TextMate-Konvertierung sehr glücklich macht.

Avocade
quelle
1
Diese Lösung ist viel einfacher als: FC und Plugins, da kein Caching erforderlich ist und ... du hast meine Tages-Avocade gemacht! Vielen Dank!
Srikumar
1
Vim liest das wd nicht als Standardverzeichnis. Ich habe die Shell neu gestartet und es funktioniert immer noch nicht. Auch versucht, vim .bevor der Befehl ausgeführt wird: /
Adam Grant
13

Ich verwende eine Kombination aus NERDTree (Verzeichnisseitenleiste), FuzzyFinder Textmate (zur Datei gehen wie TextMates CMD + T) und Sitzungen (: h-Sitzungen), um mich bei großen Projekten zu unterstützen.

Ich würde vorschlagen, einige Sitzungen Helfer Plugin zu verwenden. Ich würde erwähnen, was ich benutze, aber ich bin noch nicht zufrieden damit. Nur Google "Vim Sessions".

Wenn Sie FuzzyFinder Textmate zum Laufen bringen, sollten Sie beachten, dass es von einer alten Version des FuzzyFinder-Plugins abhängt, insbesondere von Version 2.16. Alles höher und Sie werden Fehler bekommen. Aber die Mühe lohnt sich auf jeden Fall. Obwohl der Name nicht vollständig ist, ist seine Suche intelligent. Wenn ich danach suche fro/time/actionsphp, wird die Datei apps/(fro)ntend/modules/(time)_tracking/actions/(actions).class.(php)aufgerufen (Klammern geben an, was übereinstimmt). Es macht es sehr einfach, Dateien auszuwählen, die nur anhand ihres Ordnernamens eindeutig sind.

Krapfen
quelle
2
Ich habe ein neues Plugin gefunden, das mir besser gefällt und das (zumindest in meinem Fall) einfacher einzurichten ist : CommandT . Viel schneller.
Donut
6
Ein neueres, leistungsfähigeres Tool, Writer in VIM-Skript, so dass keine externen Abhängigkeiten verwendet werden. Strgp wird vom Janus- Projekt verwendet
alexandru.topliceanu
7

Sowie die unschätzbaren ctags und die verschiedenen zugehörigen Befehle. Ich könnte auch nicht ohne das Projekt-Plugin leben , mit dem Sie die mit einem Projekt verknüpften Dateien in einem separaten Bereich speichern können. Ich kann mich nicht erinnern, wie viel von meinem Setup angepasst wurde, aber wenn ich eine Quelldatei namens Debug.c öffnen möchte, drücke ich:

<F12>     " Opens the project pane
/De       " Searches for "De", which is likely to be enough to find Debug.c or possibly Debug.h
<ENTER>   " Opens the selected file and closes the project pane

Ich mache dann oft:

:vsp      " Vertically split the window
<F12>     " Reopen project pane
#         " Search back to find previous entry with the same name (to find
            Debug.h if I was on Debug.c: my headers are in Headers/ and
            my source is in Source/, so the headers come earlier in the list
            than the source).  I use * to go the other way, obviously.
<ENTER>   " Open the header file in the other window and close the project window.

Mit dieser relativ kurzen Sequenz kann ich jede Datei und ihren Header in vertikaler Aufteilung öffnen. Da das Projekt-Plugin-Fenster nur eine Textdatei ist, wird die Fertigstellung mithilfe der Suchfunktion von Vim erreicht.

DrAl
quelle
4

Ab Vim 7.3 verfügt der :findBefehl über eine Tab-Vervollständigung der Dateinamen.

Also , wenn Sie Ihre Set - 'path'Option des gesamtes Projekt enthalten (wahrscheinlich die Verwendung von **Wildcard - rekursiv Suche Verzeichnisse zu ermöglichen), dann können Sie verwenden , um die :find, :sfind, :tabfindusw. Befehle mit Abschluss auf jede Datei in Ihrem Projekt zu erhalten. Auf diese Weise können Sie auch direkt mit gfund mit Freunden zu Dateien springen, wenn sich der Dateiname in Ihrem Text befindet, z. B. in einer Include-Direktive.

Bei dieser Methode werden keine externen Tools oder Plugins benötigt, um zu bestimmten Dateien zu navigieren. Obwohl es zugegebenermaßen nicht so schnell oder einfach zu bedienen ist und nicht auf die Notwendigkeit eingeht, zu Definitionen zu springen. Für Definitionen verwende ich ctags, wie andere Antworten vorschlagen.

Ben
quelle
3

Wenn Sie ctags verwenden, wie von anderen Postern empfohlen, lesen Sie unbedingt das Taglist- Plugin.

Nehmen Sie sich Zeit, um die Dokumente zu lesen und die Tastenkombinationen zu lernen. Hier sind einige, um Ihnen den Einstieg zu erleichtern (über das TList-Fenster):

  • o - Datei in neuem Fenster öffnen
  • t - Datei in neuem Tab öffnen
  • [[oder Rücktaste - vorherige Datei in der Liste
  • ]] oder tab - nächste Datei in der Liste
Peter Gibson
quelle
3

Üppige ctags.

Verwenden Sie Strg-], um zum Tag unter dem Cursor zu springen.

Shizzmo
quelle
2

Ich benutze FindFile . Wenn Sie vim im Stammverzeichnis Ihres Projekts öffnen und :FC .das Plugin ausführen, werden alle Dateinamen unter Ihrem cwd zwischengespeichert. Anschließend können Sie :FFein Abschlussmenü öffnen und den Namen der gewünschten Datei (oder besser gesagt die ersten Buchstaben) eingeben.


quelle
Wow, das ist wie das am einfachsten zu verwendende Plugin. Keine Einrichtung erforderlich. Geben Sie einfach FC .in Ihr Stammverzeichnis ein und :FFgeben Sie den gewünschten Dateinamen ein. Fertig. Ich versuche immer noch herauszufinden, wie man in neuen Tabs startet.
Tester
Beachten Sie auch, dass Sie bei dieser Verwendung jedes Mal, wenn Sie vim starten, die :FC .Dateien in diesem Verzeichnis zwischenspeichern müssen.
Tester
Hier ist eine aktualisierte Version von FindFile.vim mit :FToder :FindTabNew gist.github.com/1104884
Tester
2

Öffnen vimaus dem Stammverzeichnis Ihrer Quelldatei und Erweitern der pathOption, um alle Unterverzeichnisse darin einzuschließen.
Zum Beispiel set path+=/usr/include/c++/**für C ++ - Header und set path+=**für Ihr Quellverzeichnis.

Dies eröffnet dann eine Vielzahl von folgenden Möglichkeiten.

1) Öffnen der Datei nach Namen oder Teilen davon

:find file_name

Sie können die automatische Vervollständigung und Platzhaltererweiterung :findzuverlässig verwenden. Wenn Sie den Namen eingeben, wird der Name gesucht. Dies funktioniert sprachunabhängig. Ich bin sicher, es wird Ihnen gefallen.

2) Navigieren zu Dateien unter cusror:
Wenn Sie einen Dateipfad wie möchten #include "project/path/classA.h.

gf or gF  - go to file under cursor.   

Ctrl- 6- um nach gfoder zur letzten Cursorposition zurückzukehrengF

3) API-Suche und Navigation zum API-Speicherort

[ioder [Ikann verwendet werden, um Ihre Funktionssignatur für Wörter unter dem Cursor nachzuschlagen, ohne Ihren Arbeitsbereich zu verlassen. [<Tab>tatsächlich zur Erklärung gehen. Verwenden Sie Ctrl- 6, um zum letzten Ort zurückzukehren.


Ohne zu erweitern path, können Sie mit dem Navigieren durch Dateien per :ExBefehl beginnen und Ihre Datei navigieren und öffnen. Ich bevorzuge NerdTreedies jedoch.

dlmeetei
quelle
1

Obwohl ich irgendwie hoffe, dass jemand eine bessere Lösung aufzeigt, damit ich etwas lernen kann, war NERDTree gut für mich, um zu bestimmten Dateien mit Namensvervollständigung zu gelangen, solange ich den Baum erweitert habe. Der Befehl, wenn ich zu einer Datei gelangen muss, lautet wie folgt:

, d / foo.pyo (wobei foo.py ein Dateiname ist)

, d, um den Baum zu öffnen, / um in den Suchmodus zu wechseln, den Namen (oder den Teilnamen oder den regulären Ausdruck oder was auch immer) der Datei und dann o, um ihn zu öffnen.

Natürlich müssen Sie möglicherweise einige Male 'n' drücken, wenn Sie nicht genug Dateinamen eingegeben haben oder Duplikate vorhanden sind.

Ich gebe zu, es fühlt sich wie ein Hack an, NERDTree so zu verwenden, obwohl es inzwischen so weit in mein Muskelgedächtnis eingedrungen ist, dass ich nicht einmal darüber nachdenke.

Natürlich verwende ich auch ctags, aber diese sind nur nützlich, wenn Sie eine Funktion in der Nähe des Cursors haben und zu ihrer Definition in einer anderen Datei oder so etwas gelangen müssen. Oft sage ich "OK, ich muss jetzt an Feature x arbeiten" und muss zu einer anderen Datei navigieren, ohne dass Referenzen in der Nähe vorhanden sind, bei denen ctags wirklich helfen würden.

Gravitation
quelle
3
Ich habe mich noch etwas genauer damit beschäftigt, Fuzzyfinder sieht nach einer großartigen Idee für die Projektsuche aus.
Gravitation
1

Ich benutze zwei meiner Plugins:

  • searchInRuntime , das Dateinamen in der Befehlszeile vervollständigt. Es ist irgendwie ähnlich wie Fuzzyfinder und Lookupfile,
  • lh-tags, die völlig experimentell und undokumentiert sind. Es bietet zwei Funktionen: automatische und schnelle Aktualisierung der Tag-Datei beim Speichern von Dateien (ing?) Und eine <c-w><m-down>standardmäßig angeschlossene Tag-Auswahl . Vielleicht möchten Sie stattdessen das bekannte Taglist-Plugin überprüfen.

Beide benötigen meine viml-Bibliothek lh-vim-lib.

Luc Hermitte
quelle
0

Versuchen Sie SourceCodeObedinece . Dieses Projekt habe ich für das C ++ 1Gb-Quelldateiprojekt entwickelt.
Ich benutze es zusammen mit 0scan .

Diese beiden Plugins sind Wrapper für die beliebtesten Vim-Browsing-Tools: ctags und cscope .

Mykola Golubyev
quelle