Rechercher un fichier (via la recherche récursive de répertoire) dans Vim

Est-il possible de rechercher un fichier dans un répertoire de manière récursive (en utilisant des caractères génériques si nécessaire) dans Vim? Si ce n’est pas natif, existe-t-il un plugin capable de gérer cela?

Vous pouvez utiliser des caractères génériques avec la commande :edit . Alors,

 :e **/test/Suite.java 

ouvrira test / Suite.java peu importe où il se trouve dans la hiérarchie de répertoires actuelle. Cela fonctionne avec l’achèvement de tabulation afin que vous puissiez utiliser [tab] pour développer les caractères génériques avant d’ouvrir le fichier. Voir aussi l’option wildmode pour naviguer parmi toutes les extensions possibles.

Une autre astuce consiste à utiliser

 :r! find . -type f 

charger une liste de tous les fichiers du répertoire en cours dans un tampon. Vous pouvez ensuite utiliser tous les outils de manipulation de texte vim habituels pour naviguer / sortinger / découper la liste et CTRL+W gf pour ouvrir le fichier sous le curseur dans un nouveau volet.

Il y a une commande find. Si vous ajoutez ** à votre chemin, vous pouvez effectuer une recherche récursive.

 :set path 

va vous montrer votre chemin actuel, append ** en faisant quelque chose comme

 :set path=.,/usr/include,,** 

le bit avant le ** j’ai copié de l’initial :set path

alors vous pouvez juste taper

 :find myfile.txt 

et ça s’ouvre comme par magie!

Si vous ajoutez la commande set à votre fichier .vimrc, vous vous assurerez de pouvoir effectuer des recherches récursives à l’avenir. Il ne semble pas rechercher les répertoires de points (.ssh par exemple)

Je recommande ctrlp.vim . C’est un très bon plugin, idéal pour travailler dans de grands projets. Il a la recherche par nom de fichier ou chemin complet, recherche d’expressions rationnelles, détection automatique de la racine du projet (celle avec le dossier .git | hg | svn | bzr | _darcs), les exclusions de noms de fichiers et bien d’autres.

Il suffit d’appuyer sur pour ouvrir un volet très intuitif où vous pouvez rechercher ce que vous voulez:

entrer la description de l'image ici

Il est possible de sélectionner et d’ouvrir plusieurs fichiers à la fois. Il accepte également des commandes arbitraires supplémentaires, telles que le passage à une certaine ligne, une occurrence de chaîne ou toute autre commande Vim.

Repo: https://github.com/kien/ctrlp.vim

vim en tant que commande de recherche intégrée (: aide à la recherche) mais ouvre uniquement le premier fichier trouvé. Cependant, vous pouvez utiliser ce plugin incroyable: FuzzyFinder qui fait tout ce que vous voulez et même plus

Command-T vous permet de trouver un fichier très rapidement en tapant simplement des lettres. Vous pouvez également ouvrir le fichier dans un nouvel onglet, mais vim doit être compilé avec le support ruby.

Vous pouvez utiliser ! pour exécuter des commandes shell:

 :! find . -name *.xml 

vim a bild dans les commandes nommées grep, lgrep, vimgrep ou lvimgrep qui peuvent faire cela

Voici un tutoriel sur la façon de les utiliser http://vim.wikia.com/wiki/Find_in_files_within_Vim#Recursive_Search

vous pouvez également utiliser une commande externe comme find ou grep de vim en l’exécutant comme ceci

 :!find ... 

Vous pouvez parcourir le système de fichiers avec :ex . , mais je ne sais pas comment chercher de manière récursive (je suis un novice de Vim – je ne l’utilise que depuis dix ans).

Il existe quelques plug-ins de navigateurs de fichiers populaires:

  • Arbre NERD
  • Explorateur vigoureux
  • vtreexplorer

Voir aussi ce fil sur SuperUser .

Je suis surpris que personne n’ait mentionné Unite.vim .

La recherche de fichiers (flous ou non) n’est que le sumt de l’iceberg de ce qu’elle peut faire pour un développeur. Il a intégré le support pour ag , git et une myriade d’autres programmes / utilitaires / plugins vim. La courbe d’apprentissage peut être un peu raide, mais je ne peux pas imaginer ma vie sans elle. La base d’utilisateurs est grande et les bogues sont corrigés immédiatement.

Navigation de résultat similaire à Quickfix

Usage:

 Find my.regex 

Résultat:

  • un nouvel onglet s’ouvre
  • chaque ligne contient un chemin relatif correspondant à une expression grep -E
  • frappé:
    • ou gf pour ouvrir le fichier sur la ligne en cours dans un nouvel onglet
    • gf pour ouvrir le fichier sur l’onglet en cours et perdre la liste des fichiers

Recherchez plutôt tous les fichiers:

 Find 

Méthodes alternatives:

Code:

 function! Find(cmd) let l:files = system(a:cmd) if (l:files =~ '^\s*$') echomsg 'No matching files.' return endif tabedit set filetype=filelist set buftype=nofile " TODO cannot open two such file lists with this. How to get a nice tab label then? " http://superuser.com/questions/715928/vim-change-label-for-specific-tab "file [filelist] put =l:files normal ggdd nnoremap   gf execute 'autocmd BufEnter  lcd ' . getcwd() endfunction command! -nargs=1 Find call Find("find . -iname '*'" . shellescape('') . "'*'") command! -nargs=1 Gfind call Find('git ls-files | grep -E ' . shellescape('')) command! -nargs=1 Gtfind call Find('git rev-parse --show-toplevel && git ls-files | grep -E ' . shellescape('')) command! -nargs=1 Locate call Find('locate ' . shellescape('')) 

Selon votre situation (c’est-à-dire en supposant que la commande suivante ne trouve qu’un seul fichier), utilisez peut-être une commande comme:

 :e `locate SomeUniqueFileName.java` 

Cela provoquera l’ouverture de Vim, dans l’onglet actuel (la commande e), d’un fichier résultant de l’exécution (dans cet exemple),

 locate SomeUniqueFileName.java 

Notez que la magie ici est le backticks autour de la commande, qui convertira la sortie de la commande shell en texte utilisable dans la commande Vim.

Vous pouvez trouver des fichiers récursivement dans votre “chemin” avec ce plugin . Il prend également en charge la complétion par tabulation pour le nom de fichier.

Vous n’avez pas besoin d’un plugin uniquement pour cette fonction, sous l’extrait de code est suffisant.

 function! FindFiles() call inputsave() let l:dir = input("Find file in: ", expand("%:p:h"), "dir") call inputrestore() if l:dir != "" call inputsave() let l:file = input("File name: ") call inputrestore() let l:nf = 'find '.l:dir.' -type f -iname '.l:file.' -exec grep -nH -m 1 ".*" {} \;' lexpr system(l:nf) endif endfunction nnoremap  fo :call FindFiles() 

Command-t dans l’un de mes plugins vim favoris, c’est un plugin basé sur Ruby au dessus de l’intégration avec FZF.

En utilisant Comamnd-T et FZF, vous pouvez effectuer la recherche avec un mécanisme extrêmement rapide pour:

  • Ouvrir des fichiers et des tampons
  • Sauter aux balises et aider
  • Exécution de commandes ou recherches et commandes précédentes
  • avec un nombre minimal de frappes.

Comme vous pouvez le voir

entrer la description de l'image ici

Je recherche toujours dans l’historique des commandes en ouvrant un nouveau terminal et en tapant:

 CTRL+R 

En plus de rechercher dans tous les dossiers de manière récursive en écrivant dans n’importe quel onglet de terminal:

 fzf 

En outre, vous pouvez écrire à l’intérieur de vim

 :CommandT 

Vraiment puissant et rapide.