Come navigare in un progetto di grandi dimensioni in VIM


86

Come gestisci grandi progetti (centinaia di file) usando solo VIM?

Personalmente comincio ad avere problemi in qualsiasi progetto più grande del piccolo.

  • c'è un modo per "andare al file" rapidamente, preferibilmente con il completamento del nome?
  • lo stesso per "vai alla definizione della classe", quando è in un altro file

Conosco tutte le basi di VIM, quindi non ho problemi a usarlo per scrivere script o modificare rapidamente un codice sorgente. Ma diventa davvero complicato per me quando devo navigare tra i file.


Che lingua stai usando?
LB40,

Preferirei una soluzione indipendente dal linguaggio, ma ho bisogno del supporto per C ++, PHP e Rails.
Jakub Arnold,

Quale risposta hai accettato? @JakubArnold

@xetrasu ho finito per usareNERDTree
Jakub Arnold

Risposte:


33

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

Provare

:help tags

Per generare un file di tag per C / C ++, vai al prompt della shell (presumo che il tuo sistema sia * nix / Cygwin) e digita

info ctags

o

ctags --help

2
Vim ha anche il supporto per cscope, che ti permetterà di fare cose come trovare quali funzioni chiamano una data funzione - vedi :help cscopeper informazioni. C'è un bel elenco di caratteristiche nell'introduzione (sotto "È progettato per rispondere a domande come").
Cascabel

1
Sfortunatamente, cscope ha una comprensione molto limitata del C ++.
Luc Hermitte,

28

Mi piacciono le soluzioni semplici, il mio modo preferito di navigare al momento è:

Aggiungere a ~/.vimrc.local

set path=$PWD/**

Quindi digita questo nell'editor per trovare il file ovunque nella directory di lavoro corrente (pwd)

:find user_spec.rb

Puoi usare il completamento con tabulazione sui nomi dei file per trovare anche più scelte, rendendo questo TextMate convertito molto felice.


1
Questa soluzione è molto più semplice di: FC e plugin perché non è necessario il caching e ... mi hai reso la giornata avocata! Grazie!
Srikumar

1
Vim non sta leggendo wd come directory predefinita. Ho riavviato la shell e ancora non funziona. Provato anche vim .prima di eseguire il comando: /
Adam Grant

13

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

Suggerirei di utilizzare alcuni plugin di supporto per le sessioni. Vorrei menzionare quello che uso, ma non ne sono ancora soddisfatto. Solo Google "sessioni vim".

Una cosa da notare con il funzionamento di FuzzyFinder Textmate è che dipende da una vecchia versione del plugin FuzzyFinder, in particolare v2.16. Qualcosa di più alto e otterrai errori. Ma ne vale sicuramente la pena. Sebbene non abbia il completamento del nome, la sua ricerca è intelligente, quindi se lo cerco fro/time/actionsphpverrà visualizzato il file apps/(fro)ntend/modules/(time)_tracking/actions/(actions).class.(php)(le parentesi indicano ciò che corrisponde). Rende molto facile scegliere i file che sono univoci solo in base al nome della cartella.


2
Ho trovato un nuovo plugin che mi piace di più ed è più facile da configurare (almeno nel mio caso): CommandT . Più veloce.
ciambella

6
Uno strumento più nuovo e più potente, scrittore nello script vim, quindi nessuna dipendenza esterna è ctrlp utilizzato dal progetto janus
alexandru.topliceanu

7

Oltre agli inestimabili ctag e ai vari comandi associati. Inoltre, non potrei vivere senza il plug-in del progetto , che ti consente di avere i file di interesse associati a un progetto in un riquadro separato. Non ricordo quanto del mio setup sia personalizzato, ma se voglio aprire un file sorgente chiamato Debug.c, premo:

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

: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 del progetto è solo un file di testo, il completamento si ottiene utilizzando la capacità di ricerca di Vim.


4

A partire da Vim 7.3, il :findcomando ha il completamento con tabulazione dei nomi dei file.

Quindi, se si imposta la 'path'possibilità di contenere l'intero progetto (probabilmente utilizzando il **carattere jolly per consentire le sottodirectory ricorsivamente ricerca), quindi è possibile utilizzare il :find, :sfind, :tabfind, ecc comandi con il completamento di ottenere a qualsiasi file nel progetto. Ciò consente anche di passare direttamente ai file con gfe amici se il nome del file è nel testo, ad esempio in una direttiva include.

Con questo metodo, non sono necessari strumenti o plug-in esterni per navigare in file specifici. Anche se, ammettiamolo, potrebbe non essere così veloce o facile da usare e non risponde alla necessità di saltare alle definizioni. Per le definizioni, uso ctags come suggeriscono altre risposte.


3

Se stai usando ctags come consigliato da altri poster, assicurati di guardare il plugin taglist .

Assicurati di prendere il tempo per leggere i documenti e imparare le associazioni di tasti. Eccone alcuni per iniziare (dalla finestra TList):

  • o - apre il file in una nuova finestra
  • t - apre il file in una nuova scheda
  • [[o backspace - file precedente nell'elenco
  • ]] o tab - file successivo nell'elenco

3

Ctags esuberanti.

Usa Ctrl-] per saltare al tag sotto il cursore.


2

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. Puoi quindi fare :FFclic su un menu di completamento e digitare il nome del file che desideri (o meglio, le prime lettere).


wow, questo è come il plugin più facile da usare. Zero setup coinvolti .. solo FC .nella tua :FFdirectory root, quindi inserisci, inizia a digitare il nome del file che desideri e il gioco è fatto. Sto ancora cercando di capire come lanciare in nuove schede comunque ..
tester

vale anche la pena notare che se lo usi, ogni volta che avvii vim, dovrai ripetere il :FC .per memorizzare nella cache i file in quella directory.
tester

Ecco una versione aggiornata di FindFile.vim con :FTo :FindTabNew gist.github.com/1104884
tester

2

Apertura vimdalla radice del file sorgente ed estensione pathdell'opzione per includere tutte le sottodirectory al suo interno.
Ad esempio set path+=/usr/include/c++/**per le intestazioni C ++ e set path+=**per la directory di origine.

Questo, quindi, apre una pletora di seguenti possibilità.

1) Apertura del file per nome o parti di esso

:find file_name

È possibile utilizzare il completamento automatico e l'espansione con caratteri jolly con :findaffidabile. Digiti il ​​nome, individuerà il nome. Funziona indipendentemente dalla lingua, sono sicuro che ti piacerà.

2) Navigare ai file sotto cusror:
se vuoi andare in un percorso di file come #include "project/path/classA.h.

gf or gF  - go to file under cursor.   

Ctrl- 6- per tornare all'ultima posizione del cursore dopo gfogF

3) Ricerca API e navigazione nella posizione API

[ioppure [Ipuò essere utilizzato per cercare la firma della funzione per la parola sotto il cursore senza lasciare l'area di lavoro. [<Tab>per andare effettivamente alla dichiarazione. Usa Ctrl- 6per tornare all'ultima posizione.


Senza estendere path, puoi iniziare a navigare tra i file tramite :Excomando e navigare e aprire il tuo file. Preferisco NerdTreequesto però.


1

Anche se spero che qualcuno mi indichi una soluzione migliore in modo che io possa imparare qualcosa, NERDTree è stato buono con me per arrivare a file specifici con il completamento del nome fintanto che l'albero è stato espanso. Il comando quando ho bisogno di accedere a un file è qualcosa del tipo:

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

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

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

Ammetto che usare NERDTree in questo modo sembra un po 'un trucco, anche se ormai è arrivato così lontano nella mia memoria muscolare che non ci penso nemmeno.

Ovviamente uso anche i tag ctags ma quelli sono utili solo quando hai una funzione vicino al cursore e devi arrivare alla sua definizione in un altro file o qualcosa del genere. Molte volte dico "OK, ho bisogno di lavorare sulla funzione x adesso" e ho bisogno di navigare in un altro file senza alcun riferimento nelle vicinanze che ctags sarebbe davvero utile.


3
Ho esaminato ancora un po ', fuzzyfinder sembra un'ottima idea per la ricerca di progetti.
gravitazione

1

Sto usando due miei plugin:

  • searchInRuntime che completa i nomi dei file sulla riga 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 tagfile al salvataggio del file (ing?) E un selettore di tag collegato per <c-w><m-down>impostazione predefinita. Potresti invece voler controllare il rinomato plugin di taglist.

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


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.