Wie springe ich zum Funktionsaufruf?

14

Nach dem Generieren einer Tags-Datei mit exuberant-ctagskann ich von einem Funktionsaufruf zu seiner Deklaration springen, <C-]>was ziemlich praktisch ist.

Meine Frage ist, wie es anders geht? Wie kann ich zu den Zeilen gehen, in denen die Funktion aufgerufen wird, wenn sich mein Cursor auf der Definition einer Funktion befindet?

Wenn ich mir die von ctags erzeugte Datei ansehe, sehe ich nur Informationen zum Speicherort der Definition und nicht zu den Aufrufen. Bedeutet dies, dass ich das nicht kann, dass Vim eine clevere Lösung ist oder dass ich etwas verwenden muss sonst als exuberant-ctags?

statox
quelle
Ack oder Ag werden ebenfalls funktionieren und Sie können ziemlich einfach Plugin-Wrapper für diese Befehlszeilen-Tools finden. ZB github.com/mileszs/ack.vim und github.com/rking/ag.vim
Dash-Tom-Bang

Antworten:

11

Mit können Sie nicht zu Funktionsaufrufen springen ctags. Für C / C ++ und Java gibt es cscopeund es integriert sich gut in Vim (siehe :help cscope). Für andere Sprachen finden Sie möglicherweise ein Tool, das cscopekompatible Datenbanken generiert / exportiert ( hscopez. B. für Haskell und starscopefür Ruby, Go und JavaScript). Sie können auch verwenden , cscopemit GNU globalen Datenbanken, mit dem Hinweis cscopeprgauf gtags-cscope.

Noch eine Randnotiz: Wenn Sie sich nicht durch den gelegentlichen rätselhaften Gebrauch von Engrish abschrecken lassen, möchten Sie wahrscheinlich auch Universal-Ctags anstelle von verwenden exuberant-ctags. Letzteres wurde seit Jahren nicht mehr aktualisiert. Ersteres ist eine aktiv gewartete Gabel.

Sato Katsura
quelle
Unterstützt cscope andere Sprachen als C / C ++ und Java?
Edi9999
@ edi9999 cscopeselbst unterstützt C / C ++, Lex und Yacc. Die Unterstützung für Java ist kaum sinnvoll. Sie können Unterstützung für (altmodisches) PHP und JavaScript von GNU globalüber das gtags-cscopeDienstprogramm erhalten. Und wie ich bereits sagte, gibt es andere Indexer, die cscopekompatible Datenbanken exportieren können.
Sato Katsura
8

Mit ctags geht das nicht.

Probieren Sie eine bessere Alternative aus, wie cscope (das sogar einen eigenen Hilfeabschnitt hat :):help cscope oder global .

romainl
quelle
Unterstützt cscope andere Sprachen als C / C ++ und Java?
Edi9999
Ja, zumindest PHP und JavaScript.
Romainl
1
@romainl Nope cscopeselbst unterstützt weder PHP noch JavaScript. Sie können jedoch PHP- und JavaScript-Dateien mit GNU indizieren und globaldann ausführen gtags-cscope, um die resultierende gtagsDatei mit zu verwenden cscope.
Sato Katsura
@SatoKatsura, ja, cscope unterstützt JavaScript (und anscheinend CSS).
Romainl
2
@romainl Sie sollten überlegen, sich cscopedie Quellen anzusehen, anstatt auf der Grundlage schneller Experimente zu spekulieren. cscopehat einen eher entspannten C-Parser. Das ist alles was es hat und alles was es tut. Mit diesem Parser werden viele Sprachen "unterstützt", für geeignete Werte von "support". Konstrukte werden erkannt, solange sie mehr oder weniger wie C aussehen. Deshalb werden zB Java-Klassen und neuere PHP-Konstrukte nicht erkannt. Vergleichen Sie fi mit starscope , um neue Sprachen hinzuzufügen.
Sato Katsura
8

Mit dem grep- Befehl von Vim können Sie alle Dateien in Ihrem Projekt durchsuchen:

:grep! "\<<cword>\>" . -r
:copen

Lassen Sie uns das in eine Tastenkombination setzen:

nnoremap <F4> :grep! "\<<cword>\>" . -r<CR>:copen<CR>

Ich finde diese projektweite Suche mit nur einem Schlüssel von unschätzbarem Wert, wenn ich eine große ungewohnte Codebasis erforsche.

\<und \>sind reguläre Ausdrücke, die den Anfang und das Ende eines Wortes anzeigen, so dass Sie keine partiellen Übereinstimmungen erhalten. (Die -wOption grep könnte eine andere Möglichkeit sein, dies zu erreichen.)

Dies ist jedoch eine unintelligente Suche , so dass es zu Fehlalarmen kommen kann, wenn dasselbe Wort in nicht zusammenhängenden Zusammenhängen vorkommt.


Ehrlich gesagt verwende ich stattdessen meine eigene modifizierte Version des grep.vim-Plugins . Dies ist etwas freundlicher zu bedienen:

  • Damit können Sie das Suchmuster bearbeiten, und auch das grep Kommandozeile (so Sie bestimmte Ordner wie Target kann src/ lib/statt .und erinnert sich an die Veränderungen).
  • Ich habe Unterstützung für Googles csearch hinzugefügt . Dies kann viel schneller als grep sein, da es einen Index von Wörtern erstellt und nicht jedes Mal jede Datei überprüft. Insbesondere verwendet csearch einen etwas anderen regulären Ausdrucksstandard und \bmuss daher anstelle von \<und verwendet werden \>.

Ich konfiguriere es und schließe einige Standarddateien wie diese aus .

Für den schnellen Zugriff erstelle ich zwei Tastenkombinationen . F3Ermöglicht das Bearbeiten der Befehlszeile. F4Verwendet die zuvor konfigurierte Befehlszeile ohne zusätzliche Tastenanschläge. Der Mechanismus ist ziemlich hässlich und könnte aufgeräumt werden, aber er hat mir gute Dienste geleistet.

joeytwiddle
quelle