Come saltare alla funzione di chiamata?


14

Dopo aver generato un file tag con exuberant-ctagsposso passare da una chiamata di funzione alla sua dichiarazione con la <C-]>quale è abbastanza conveniente.

La mia domanda è come farlo nell'altro modo? Quando il mio cursore si trova sulla definizione di una funzione, come posso andare alle linee in cui viene chiamata la funzione?

Quando guardo il file generato da ctags vedo solo informazioni relative alla posizione della definizione e non delle chiamate, significa che non posso farlo, che Vim è una soluzione intelligente o che devo usare qualcosa altro che exuberant-ctags?


Ack o Ag funzioneranno anche e puoi trovare involucri di plugin per questi strumenti da riga di comando abbastanza facilmente. Ad esempio github.com/mileszs/ack.vim e github.com/rking/ag.vim
dash-tom-bang

Risposte:


11

Non è possibile passare alle funzioni con le chiamate ctags. Per C / C ++ e Java esiste cscope, e si integra perfettamente con Vim (vedi :help cscope). Per altre lingue potresti essere in grado di trovare uno strumento che genera / esporta cscopedatabase compatibili (fi hscopeper Haskell e starscopeper Ruby, Go e JavaScript). È inoltre possibile utilizzare cscopecon GNU globali banche dati, puntando cscopeprga gtags-cscope.

Una nota a margine: se non sei scoraggiato dall'uso occasionalmente sconcertante di Engrish ,;) probabilmente vorrai anche usare universal-ctags invece di exuberant-ctags. Quest'ultimo non è stato aggiornato da anni. Il primo è un fork mantenuto attivamente.


Cscope supporta altre lingue oltre a C / C ++ e Java?
edi9999,

@ edi9999 cscopestesso supporta C / C ++, Lex e Yacc. Il supporto per Java è marginalmente utile. È possibile ottenere supporto per PHP (vecchio stile) e JavaScript da GNU global, tramite l' gtags-cscopeutilità. E, come ho detto sopra, ci sono altri indicizzatori che possono esportare cscopedatabase compatibili.
Sato Katsura,

8

Non puoi farlo con i tag.

Prova un'alternativa più robusta come cscope (che ha anche la sua sezione di aiuto:) :help cscopeo globale .


Cscope supporta altre lingue oltre a C / C ++ e Java?
edi9999,

Sì, almeno PHP e JavaScript.
romainl,

1
@romainl No, esso cscopestesso non supporta né PHP né JavaScript. Puoi comunque indicizzare i file PHP e JavaScript con GNU global, quindi eseguire gtags-cscopeper utilizzare il gtagsfile risultante con cscope.
Sato Katsura,

@SatoKatsura, sì, cscope supporta JavaScript (e CSS, in modo appropriato).
romainl,

2
@romainl Dovresti considerare cscopele fonti invece di speculare sulla base di rapidi esperimenti. cscopeha un parser C piuttosto rilassato. Questo è tutto ciò che ha e tutto ciò che fa. Con quel parser "supporta" molte lingue, per valori adeguati di "supporto". I costrutti sono riconosciuti purché assomiglino più o meno a C. Ecco perché non vengono riconosciute le classi Java e i nuovi costrutti PHP. Confronta fi con starscope , che in realtà consente l'aggiunta di nuove lingue.
Sato Katsura,

8

Puoi usare il comando grep di Vim per cercare tutti i file nel tuo progetto:

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

Mettiamolo in una combinazione di tasti:

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

Trovo che questa ricerca a chiave unica a livello di progetto abbia un valore inestimabile quando sto esplorando una base di codice non familiare.

\<e \>sono sequenze regexp che indicano l'inizio e la fine di una parola, quindi non otterrai corrispondenze parziali. (L' -wopzione per grep potrebbe essere un altro modo per raggiungere questo obiettivo.)

Tuttavia, questa è una ricerca non intelligente , quindi può produrre falsi positivi se la stessa parola appare in contesti non correlati.


Sinceramente, uso invece la mia versione modificata del plugin grep.vim . Questo è leggermente più facile da usare:

  • Ti consente di modificare il modello di ricerca e anche la riga di comando grep (in modo da poter scegliere come target cartelle specifiche come src/ lib/invece di .) e ricordare le modifiche.
  • Ho aggiunto il supporto per Google CCercare . Questo può essere molto più veloce di grep perché crea un indice di parole anziché scansionare ogni file ogni volta. In particolare, csearch utilizza uno standard regexp leggermente diverso, quindi \bdeve essere usato al posto di \<e \>.

Lo configuro ed escludo alcuni file standard come questo .

Per un accesso veloce, creo due combinazioni di tasti . F3mi consente di modificare la riga di comando, F4utilizza la riga di comando precedentemente configurata senza tasti aggiuntivi. Il meccanismo è piuttosto brutto e potrebbe usare un po 'di pulizia, ma mi ha servito bene.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.