2009-09-22 12 views
77

Come gestite grandi progetti (centinaia di file) usando solo VIM?Come navigare nel grande progetto in VIM

Personalmente inizio ad avere problemi in un progetto più grande di quello piccolo.

  • c'è un modo per passare rapidamente al file, preferibilmente con il completamento del nome?
  • stesso per 'andare a definizione della classe', quando si trova in un altro file

I kinda conoscere tutte le basi VIM, in modo da non avere problemi ad usarlo per la scrittura di script o l'editing veloce un po 'di codice sorgente . Ma diventa davvero complicato per me quando devo navigare tra i file.

+0

Che lingua stai usando? – LB40

+0

Preferisco la soluzione agnostica della lingua, ma ho bisogno di supporto per C++, PHP e Rails. –

risposta

29

VIM ha un eccellente supporto per i tag . Una volta creato un file di tag per il tuo progetto, puoi passare a una definizione o dichiarazione di un metodo, classe, ecc., Incluso saltare tra i file, tutto all'interno della stessa sessione di modifica.

Prova

:help tags 

per generare un file tag per C/C++, andare al prompt della shell (sto supponendo che il sistema è * nix/Cygwin) e digitare

info ctags 

o

ctags --help 
+2

Vim ha anche il supporto per cscope, che ti permette di fare cose come trovare quali funzioni chiamano una determinata funzione - vedi ': help cscope' per informazioni. C'è una bella lista di funzioni nell'introduzione (sotto "È progettato per rispondere a domande come"). – Cascabel

+1

Sfortunatamente, cscope ha una conoscenza molto limitata del C++. –

12

io uso una combinazione di NERDTree (directory barra laterale), FuzzyFinder Textmate (go-to-file come TextMate di CMD + T) e Sessioni (: h sessioni) per aiutarmi a gestire progetti di grandi dimensioni.

Suggerirei di utilizzare alcune sessioni di helper plug-in. Vorrei menzionare quello che uso, ma non sono ancora soddisfatto. Solo Google "vim sessions".

Una cosa da notare per il funzionamento di FuzzyFinder Textmate è che dipende da una vecchia versione del plug-in FuzzyFinder, in particolare dalla v2.16. Qualunque cosa sia più alta e otterrai errori. Ma ne vale senz'altro la pena. Anche se non ha il completamento del nome, la sua ricerca è intelligente, quindi se cerco fro/time/actionsphp estrarrà il file apps/(fro)ntend/modules/(time)_tracking/actions/(actions).class.(php) (le parentesi indicano che cosa corrisponde). Rende molto facile scegliere i file che sono unici per il loro nome di cartella.

+2

Ho trovato un nuovo plug-in che mi piace di più ed è più semplice da configurare (almeno nel mio caso): [CommandT] (https://wincent.com/products/command-t). Più veloce. – donut

+6

Uno strumento più recente e più potente, autore di script vim, quindi nessuna dipendenza esterna è [ctrlp] (http://www.vim.org/scripts/script.php?script_id=3736) usata dal [progetto janus] (https://github.com/carlhuda/janus) –

1

Anche se spero che qualcuno indicherà una soluzione migliore in modo da poter imparare qualcosa, NERDTree è stato buono con me per ottenere file specifici con il completamento del nome, purché l'albero sia stato espanso. Il comando, quando ho bisogno di ottenere un file è qualcosa di simile:

, d/foo.pyo (dove foo.py è un nome di file)

, d per aprire l'albero,/per entrare in modalità di ricerca , il nome (o il nome parziale, o regex, o qualsiasi altra cosa) del file, e quindi o per aprire.

Naturalmente potresti dover premere "n" alcune volte se non hai digitato abbastanza il nome del file o ci sono dei duplicati.

Ammetto che mi sembra un po 'un attacco usando NERDTree come questo anche se ormai è arrivato così lontano nella mia memoria muscolare che non ci penso nemmeno.

Ovviamente anch'io uso i ctags ma sono utili solo quando si ha una funzione vicino al cursore e si deve raggiungere la sua definizione in un altro file o qualcosa del genere. Molte volte dico "OK, ho bisogno di lavorare su feature x now" e ho bisogno di navigare in un altro file senza riferimenti nelle vicinanze che sarebbe utile per i ctags.

+3

L'ho esaminato un po 'di più, fuzzyfinder sembra una grande idea per la ricerca di progetti. – gravitation

1

sto usando due plugin di mine:

  • searchInRuntime che completa nomi di file su linea di comando. È in qualche modo simile a fuzzyfinder e lookupfile,
  • lh-tags che è completamente sperimentale e non documentato. Offre due funzionalità: aggiornamento automatico e rapido del file di tag su file save (ing?), E un selettore di tag collegato a <c-w><m-down> per impostazione predefinita. Puoi invece controllare il famoso plugin per taglist.

Entrambi richiedono la mia libreria viml lh-vim-lib.

7

Oltre agli inestimabili ctags e ai vari comandi associati. Inoltre, non potrei vivere senza lo project plugin, che consente di avere i file di interesse associati a un progetto in un riquadro separato. Non riesco a ricordare quanto di mia configurazione è personalizzabile, ma se voglio aprire un file sorgente chiamato Debug.c, mi ha colpito:

<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 

Spesso poi fare:

: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. 

Con questa sequenza relativamente breve, posso aprire qualsiasi file e la sua intestazione in una divisione verticale. Poiché la finestra del plugin di progetto è solo un file di testo, il completamento viene ottenuto utilizzando la capacità di ricerca di Vim.

3

Se si utilizzano i ctag come consigliato da altri poster, assicurarsi di controllare il plug-in taglist.

Assicurati di prendere il tempo per leggere i documenti e imparare i collegamenti dei tasti. Ecco alcuni per iniziare (dalla finestra TList):

  • o - file aperto in una nuova finestra
  • t - file aperto in una nuova scheda
  • [[o backspace - file precedente nella lista
  • ]] o scheda - file successivo nella lista
0

Prova SourceCodeObedinece. Questo ho sviluppato per gestire il progetto di file sorgente C++ da 1 Gb.
Lo uso in coppia con 0scan.

Questi due plug-in sono wrapper attorno agli strumenti di navigazione Vim più popolari: ctags e cscope.

+0

È buono per il codice C++, cscope non funziona correttamente per C++ –

2

Io uso FindFile. Se apri vim alla radice del tuo progetto ed esegui :FC ., il plugin memorizzerà nella cache tutti i nomi di file sotto il tuo cwd. È quindi possibile fare :FF per aprire un menu di completamento e digitare il nome del file desiderato (o meglio, le prime lettere).

+0

wow questo è come il plugin più semplice da usare. Zero setup coinvolti .. solo 'FC .' nella directory principale, quindi': FF' enter, inizia a digitare il nome del file che vuoi e il gioco è fatto. Sto cercando di capire come lanciare in nuove schede anche se .. – tester

+0

vale anche la pena notare che se si utilizza questo, ogni volta che si avvia vim, è necessario ripetere il ': FC .' per memorizzare nella cache i file in quella directory . – tester

+0

Ecco una versione aggiornata di FindFile.vim con ': FT' o': FindTabNew' https://gist.github.com/1104884 – tester

2

Ctag esuberanti.

Utilizzare Ctrl] per saltare al tag sotto il cursore.

22

mi piace soluzioni semplici, il mio modo preferito per navigare in questo momento è:

Aggiungi al ~/.vimrc.local

set path=$PWD/** 

Poi digitare questo nell'editor di trovare il file in qualsiasi punto della directory di lavoro corrente (pwd)

:find user_spec.rb 

È possibile utilizzare scheda di completamento sui nomi dei file per trovare scelte multiple così, rendendo questo TextMate convertire molto felice.

+1

Questa soluzione è molto più semplice di: FC e plug-in perché non è necessario il caching e .. Hai fatto la mia giornata di avocado! Grazie! – Srikumar

+0

Vim non sta leggendo il wd come directory predefinita. Ho riavviato la shell e ancora non funziona. Ho anche provato '' vim .'' prima di eseguire il comando: / –

4

A partire dal Vim 7.3, il comando ha :find scheda di completamento dei nomi di file.

Quindi, se si imposta l'opzione 'path' per contenere l'intero progetto (probabilmente utilizzando il ** jolly per consentire le sottodirectory ricorsivamente ricerca), quindi è possibile utilizzare il :find, :sfind, :tabfind, ecc comandi con il completamento per arrivare a qualsiasi file nel tuo progetto. Ciò consente anche di saltare direttamente ai file con gf e amici se il nome del file è nel testo, ad esempio in una direttiva di inclusione.

Con questo metodo, senza strumenti o plugin esterni sono necessari per la navigazione a file specifici. Anche se, può certamente non essere veloce o facile da usare, e non affronta la necessità di saltare alle definizioni. Per le definizioni, io uso i ctags come suggeriscono altre risposte.

1

Apertura vim dalla radice del file sorgente ed estensione dell'opzione path per includere tutte le sottodirectory in esso contenute.
Per esempio set path+=/usr/include/c++/** per le intestazioni C++ e set path+=** per la vostra directory di origine.

Questo, dunque, si apre una pletora di seguenti possibilità.

1) l'apertura del file in base al nome o parti di esso

:find file_name 

È possibile utilizzare l'auto-completamento e di espansione jolly con :find affidabile. Questo funziona agnostico della lingua.

2) Navigazione verso file sotto cusror:
se si vuole andare un percorso di file come #include "project/path/classA.h.

gf or gF - go to file under cursor. 

Ctrl - - di tornare a all'ultima posizione del cursore dopo gf o gF

gd - go to definition for word under cursor within the file. 

anche la lingua agnostico.

3) ricerca API e lo spostamento nella posizione API

[i o [I può essere utilizzato per cercare la firma funzione per parola sotto il cursore senza lasciare l'area di lavoro. [<Tab> per andare effettivamente alla dichiarazione. Utilizzare Ctrl - per tornare all'ultima posizione.


senza estendere path, è possibile iniziare la navigazione dei file da :Ex dei comandi e accedere e aprire il file. Preferisco lo NerdTree a questo però.