Comment naviguer dans un grand projet dans VIM

86

Comment gérez-vous de gros projets (des centaines de fichiers) en utilisant uniquement VIM?

Personnellement, je commence à avoir des problèmes dans tout projet plus grand que petit.

  • y a-t-il un moyen d'aller rapidement au fichier, de préférence avec la complétion du nom?
  • idem pour 'aller à la définition de classe', quand il est dans un autre fichier

Je connais un peu toutes les bases de VIM, donc je n'ai aucun problème à l'utiliser pour écrire des scripts ou éditer rapidement du code source. Mais cela devient vraiment compliqué pour moi lorsque je dois naviguer entre les fichiers.

Jakub Arnold
la source
Quelle langue utilisez-vous?
LB40
Je préfère une solution indépendante du langage, mais j'ai besoin de support pour C ++, PHP et Rails.
Jakub Arnold
Quelle réponse avez-vous acceptée? @JakubArnold
@xetrasu J'ai fini par utiliserNERDTree
Jakub Arnold

Réponses:

33

VIM a un excellent support pour les balises . Une fois que vous avez créé un fichier de balises pour votre projet, vous pouvez accéder à une définition ou à une déclaration d'une méthode, d'une classe, etc., y compris en parcourant les fichiers, le tout dans la même session d'édition.

Essayer

:help tags

Pour générer un fichier de balises pour C / C ++, accédez à l'invite de votre shell (je suppose que votre système est * nix / Cygwin) et tapez

info ctags

ou

ctags --help
PAUSE système
la source
2
Vim prend également en charge cscope, qui vous permettra de faire des choses comme trouver quelles fonctions appellent une fonction donnée - voir :help cscopepour plus d'informations. Il y a une belle liste de fonctionnalités dans l'introduction (sous "Elle est conçue pour répondre à des questions comme").
Cascabel le
1
Malheureusement, cscope a une compréhension très limitée du C ++.
Luc Hermitte
28

J'aime les solutions simples, ma façon préférée de naviguer en ce moment est:

Ajouter à ~/.vimrc.local

set path=$PWD/**

Tapez ensuite ceci dans l'éditeur pour trouver le fichier n'importe où dans le répertoire de travail actuel (pwd)

:find user_spec.rb

Vous pouvez également utiliser la complétion par tabulation sur les noms de fichiers pour trouver plusieurs choix, ce qui rend cette conversion TextMate très heureuse.

avocat
la source
1
Cette solution est bien plus simple que: FC et plugins car aucune mise en cache n'est nécessaire et ... vous avez fait ma journée d'avocat! Merci!
Srikumar
1
Vim ne lit pas le wd comme répertoire par défaut. J'ai redémarré le shell et cela ne fonctionne toujours pas. Également essayé vim .avant d'exécuter la commande: /
Adam Grant
13

J'utilise une combinaison de NERDTree (barre latérale du répertoire), FuzzyFinder Textmate (aller dans un fichier comme CMD + T de TextMate) et Sessions (: h sessions) pour m'aider à gérer de grands projets.

Je suggérerais d'utiliser un plugin d'aide aux sessions. Je mentionnerais ce que j'utilise, mais je n'en suis pas encore satisfait. Juste Google "sessions vim".

Une chose à noter pour faire fonctionner FuzzyFinder Textmate est que cela dépend d'une ancienne version du plugin FuzzyFinder, en particulier la v2.16. Tout ce qui est supérieur et vous obtiendrez des erreurs. Mais ça vaut vraiment la peine. Bien qu'il n'ait pas de complétion de nom, sa recherche est intelligente, donc si je la recherche, fro/time/actionsphpelle extraira le fichier apps/(fro)ntend/modules/(time)_tracking/actions/(actions).class.(php)(les parenthèses indiquent ce qu'il correspond). Il est très facile de sélectionner des fichiers qui ne sont uniques que par leur nom de dossier.

Donut
la source
2
J'ai trouvé un nouveau plugin que j'aime mieux et qui est plus facile à installer (du moins dans mon cas): CommandT . Plus vite.
donut
6
Un outil plus récent et plus puissant, rédacteur en script vim, donc aucune dépendance externe n'est ctrlp utilisée par le projet janus
alexandru.topliceanu
7

Ainsi que les précieux ctags et les différentes commandes associées. Je ne pourrais pas non plus vivre sans le plugin de projet , qui vous permet d'associer les fichiers d'intérêt à un projet dans un volet séparé. Je ne me souviens pas à quel point ma configuration est personnalisée, mais si je veux ouvrir un fichier source appelé Debug.c, je frappe:

<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

Je fais souvent alors:

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

Avec cette séquence relativement courte, je peux ouvrir n'importe quel fichier et son en-tête dans une division verticale. Étant donné que la fenêtre du plugin de projet n'est qu'un fichier texte, la complétion est obtenue en utilisant la capacité de recherche de Vim.

DrAl
la source
4

À partir de Vim 7.3, la :findcommande a complété la tabulation des noms de fichiers.

Donc , si vous définissez votre 'path'option pour contenir votre projet (probablement en utilisant le **caractère générique pour permettre la recherche récursive les sous - répertoires), vous pouvez utiliser le :find, :sfind, :tabfind, etc. commandes avec la fin pour obtenir à tout fichier dans votre projet. Cela permet également d'accéder directement aux fichiers avec gfet amis si le nom du fichier est dans votre texte, par exemple dans une directive d'inclusion.

Avec cette méthode, aucun outil externe ou plug-in n'est nécessaire pour naviguer vers des fichiers spécifiques. Bien que, il ne soit certes pas aussi rapide ou facile à utiliser, et ne répond pas au besoin de sauter aux définitions. Pour les définitions, j'utilise des ctags comme le suggèrent d'autres réponses.

Ben
la source
3

Si vous utilisez des ctags comme d'autres affiches l'ont recommandé, assurez-vous de regarder le plugin taglist .

Assurez-vous de prendre le temps de lire les documents et d'apprendre les raccourcis clavier. En voici quelques-uns pour commencer (à partir de la fenêtre TList):

  • o - ouvrir le fichier dans une nouvelle fenêtre
  • t - ouvrir le fichier dans un nouvel onglet
  • [[ou retour arrière - fichier précédent dans la liste
  • ]] ou tab - fichier suivant dans la liste
Peter Gibson
la source
3

Ctags exubérants.

Utilisez Ctrl-] pour accéder à la balise sous le curseur.

Shizzmo
la source
2

J'utilise FindFile . Si vous ouvrez vim à la racine de votre projet et exécutez :FC .le plugin mettra en cache tous les noms de fichiers sous votre cwd. Vous pouvez alors faire :FFpour ouvrir un menu de complétion et taper le nom du fichier que vous voulez (ou plutôt, les premières lettres).


la source
wow c'est comme le plugin le plus simple à utiliser. Aucune configuration impliquée .. juste FC .dans votre :FFrépertoire racine, puis entrez, commencez à taper le nom de fichier que vous voulez et vous avez terminé. J'essaye toujours de comprendre comment lancer dans de nouveaux onglets ..
testeur
il convient également de noter que si vous l'utilisez, à chaque fois que vous lancez vim, vous devrez refaire le :FC .pour mettre en cache les fichiers dans ce répertoire.
testeur
Voici une version mise à jour de FindFile.vim avec :FTou :FindTabNew gist.github.com/1104884
testeur
2

Ouverture à vimpartir de la racine de votre fichier source et extension de l' pathoption pour y inclure tous les sous-répertoires.
Par exemple set path+=/usr/include/c++/**pour les en-têtes C ++ et set path+=**pour votre répertoire source.

Ceci ouvre alors une pléthore de possibilités suivantes.

1) Ouverture du fichier par nom ou par parties de celui-ci

:find file_name

Vous pouvez utiliser la complétion automatique et l'expansion générique de :findmanière fiable. Vous tapez le nom, il localisera le nom. Cela fonctionne indépendamment de la langue. Je suis sûr que vous l'aimerez.

2) Naviguer vers les fichiers sous cusror:
si vous voulez aller un chemin de fichier comme #include "project/path/classA.h.

gf or gF  - go to file under cursor.   

Ctrl- 6- pour revenir à la dernière position du curseur après gfougF

3) Recherche d'API et navigation vers l'emplacement de l'API

[iou [Ipeut être utilisé pour rechercher votre signature de fonction pour le mot sous le curseur sans quitter votre espace de travail. [<Tab>pour aller réellement à la déclaration. Utilisez Ctrl- 6pour revenir au dernier emplacement.


Sans étendre path, vous pouvez commencer à naviguer dans les fichiers par :Excommande et naviguer et ouvrir votre fichier. Je préfère NerdTreecependant.

dlmeetei
la source
1

Bien que j'espère un peu que quelqu'un me montrera une meilleure solution pour que je puisse apprendre quelque chose, NERDTree a été bon avec moi pour accéder à des fichiers spécifiques avec complétion de nom tant que l'arborescence est développée. La commande lorsque j'ai besoin d'accéder à un fichier est quelque chose comme:

, d / foo.pyo (où foo.py est un nom de fichier)

, d pour ouvrir l'arborescence, / pour entrer en mode de recherche, le nom (ou le nom partiel, ou regex, ou autre) du fichier, puis o pour ouvrir.

Bien sûr, vous devrez peut-être appuyer sur «n» plusieurs fois si vous n'avez pas tapé suffisamment de nom de fichier ou s'il y a des doublons.

J'admets que cela ressemble un peu à un hack d'utiliser NERDTree comme celui-ci, bien que cela soit si loin dans ma mémoire musculaire que je n'y pense même pas.

Bien sûr, j'utilise aussi des ctags, mais ceux-ci ne sont utiles que lorsque vous avez une fonction près du curseur et que vous devez accéder à sa définition dans un autre fichier ou quelque chose. Souvent, je dis "OK, j'ai besoin de travailler sur la fonctionnalité x maintenant" et j'ai besoin de naviguer vers un autre fichier sans aucune référence à proximité avec laquelle ctags aiderait vraiment.

gravitation
la source
3
Je l'ai examiné un peu plus, Fuzzyfinder semble être une excellente idée pour la recherche de projets.
gravitation
1

J'utilise deux de mes plugins:

  • searchInRuntime qui complète les noms de fichiers sur la ligne de commande. Il est en quelque sorte similaire à Fuzzyfinder et Lookupfile,
  • lh-tags qui est complètement expérimental et non documenté. Il offre deux fonctionnalités: une mise à jour automatique et rapide du tagfile lors de l'enregistrement du fichier (ing?), Et un sélecteur de tag branché <c-w><m-down>par défaut. Vous voudrez peut-être vérifier le plugin renommé de liste de tags à la place.

Les deux nécessitent ma bibliothèque viml lh-vim-lib.

Luc Hermitte
la source
0

Essayez SourceCodeObedinece . Celui-ci que j'ai développé pour gérer le projet de fichiers source C ++ 1Gb.
Je l'utilise en paire avec 0scan .

Ces deux plugins sont des wrappers autour des outils de navigation Vim les plus populaires: ctags et cscope .

Mykola Golubyev
la source