web-dev-qa-db-fra.com

Comment naviguer dans un grand projet dans VIM

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

Personnellement, je commence à avoir des problèmes dans des projets plus grands que petits.

  • existe-t-il un moyen "d'aller rapidement dans le 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 quand je dois naviguer entre les fichiers .

83
Jakub Arnold

VIM a un excellent support pour tags. Une fois que vous avez créé un fichier de balises pour votre projet, vous pouvez passer à la définition ou à la déclaration d'une méthode, d'une classe, etc., y compris passer d'un fichier à l'autre, 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 à votre invite de shell (je suppose que votre système est * nix/Cygwin) et tapez

info ctags

ou

ctags --help
31
system PAUSE

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 tabulation sur les noms de fichiers pour trouver plusieurs choix, ce qui rend cette conversion TextMate très heureuse.

26
avocade

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

Je suggère d'utiliser certains plugins d'assistance pour les 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. Quelque chose de plus élevé et vous obtiendrez des erreurs. Mais cela en vaut vraiment la peine. Bien qu'il n'ait pas de complétion de nom, sa recherche est intelligente, donc si je recherche fro/time/actionsphp Il affichera le fichier apps/(fro)ntend/modules/(time)_tracking/actions/(actions).class.(php) (les parenthèses indiquent ce qui correspond). Il est très facile de sélectionner des fichiers qui ne sont uniques que par leur nom de dossier.

13
donut

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

<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 alors souvent:

: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, l'achèvement est réalisé en utilisant la fonction de recherche de Vim.

7
DrAl

À partir de Vim 7.3, la commande :find A la tabulation des noms de fichiers.

Donc, si vous définissez votre option 'path' Pour contenir l'intégralité de votre projet (en utilisant probablement le caractère générique ** Pour autoriser la recherche récursive dans les sous-répertoires), vous pouvez utiliser les :find, :sfind, :tabfind, Etc. commandes avec complétion pour accéder à n'importe quel fichier de votre projet. Cela permet également de passer directement aux fichiers avec gf et amis si le nom du fichier est dans votre texte, par exemple dans une directive include.

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

4
Ben

Ctags exubérants.

Utilisez Ctrl-] pour passer à la balise sous le curseur.

3
Shizzmo

Si vous utilisez 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. Voici quelques exemples pour vous aider à démarrer (à 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
3
Peter Gibson

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 :FF pour ouvrir un menu de fin et taper le nom du fichier souhaité (ou plutôt les premières lettres).

2
Cynshard

Bien que j'espère un peu que quelqu'un vous indiquera une meilleure solution pour que j'apprenne quelque chose, NERDTree a été bon pour moi pour accéder à des fichiers spécifiques avec un nom complet 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 recherche, le nom (ou nom partiel, ou regex, ou autre) du fichier, puis o pour l'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 de piratage en utilisant NERDTree comme celui-ci, bien qu'il soit entré si loin dans ma mémoire musculaire maintenant que je n'y pense même plus.

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 obtenir sa définition dans un autre fichier ou quelque chose. Souvent, je dis "OK, je dois travailler sur la fonction x maintenant" et je dois naviguer vers un autre fichier sans aucune référence à proximité avec laquelle ctags aiderait vraiment.

1
gravitation

Ouvrir vim à partir de la racine de votre fichier source et étendre l'option path 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.

Cela ouvre donc une multitude de possibilités suivantes.

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

:find file_name

Vous pouvez utiliser la complétion automatique et l'expansion de caractères génériques avec :find fiable. Vous tapez le nom, il trouvera le nom. Cela fonctionne indépendamment de la langue, je suis sûr que vous l'aimerez.

2) Navigation vers les fichiers sous cusror:
si vous voulez suivre 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 gf ou gF

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

[i ou [I peut être utilisé pour rechercher votre signature de fonction pour Word sous le curseur sans quitter votre espace de travail. [<Tab> pour aller à la déclaration. Utilisation Ctrl-6 pour revenir au dernier emplacement.


Sans étendre path, vous pouvez commencer à parcourir les fichiers par :Ex commande et naviguez et ouvrez votre fichier. Mais je préfère NerdTree à cela.

1
dlmeetei

J'utilise deux 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 fichier de balises lors de l'enregistrement du fichier (ing?), Et un sélecteur de balises branché sur <c-w><m-down> par défaut. Vous voudrez peut-être plutôt vérifier le célèbre plugin de liste de balises.

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

1
Luc Hermitte

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

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

0
Mykola Golubyev