web-dev-qa-db-fra.com

Trouver un fichier (via une recherche de répertoire récursive) dans Vim

Existe-t-il un moyen de rechercher un fichier 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?

67
mat-mcloughlin

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

:e **/test/Suite.Java

ouvrira test/Suite.Java, où qu’il se trouve dans la hiérarchie actuelle des répertoires. Cela fonctionne avec la complétion par des tabulations, vous pouvez donc utiliser [tab] pour développer les caractères génériques avant d'ouvrir le fichier. Voir aussi l'option wildmode pour un moyen de parcourir toutes les extensions possibles.

Une autre astuce consiste à utiliser

:r! find . -type f

pour charger une liste de tous les fichiers du répertoire courant dans un tampon. Ensuite, vous pouvez utiliser tous les outils de manipulation de texte vim habituels pour naviguer/trier/couper la liste, et CTRL+W gf pour ouvrir le fichier sous le curseur dans un nouveau volet.

87
David Winslow

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

:set path

vous montrera votre chemin actuel, ajoutez ** en faisant quelque chose comme

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

le bit avant le ** que j'ai copié à partir du :set path initial

alors vous pouvez simplement taper

:find myfile.txt

et ça s'ouvre comme par magie!

Si vous ajoutez la commande set à votre fichier .vimrc, vous pourrez effectuer une recherche récursive ultérieurement. Il ne semble pas chercher dans les répertoires de points (.ssh par exemple)

38
Stephen Paulger

Je recommanderais ctrlp.vim . C'est un très bon plugin, idéal pour travailler dans de grands projets. Il possède une recherche par nom de fichier ou chemin complet, une recherche rationnelle, une détection automatique de la racine du projet (celle avec le dossier .git | hg | svn | bzr | _darcs), des exclusions de noms de fichiers personnalisés, etc.

Appuyez simplement sur <c-p> et cela ouvrira un panneau très intuitif dans lequel vous pourrez rechercher ce que vous voulez:

 enter image description here

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

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

17
Victor Schröder

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

6
mb14

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

3
Martin Baum

Vous pouvez parcourir le système de fichiers avec :ex ., mais je ne sais pas comment effectuer une recherche récursive (je suis un novice Vim - je l'utilise seulement depuis dix ans).

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

Voir aussi ce fil sur SuperUser .

2
Paul Ruane

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

:! find . -name *.xml
2
Peter Tillemans

Résultat de type Quickfix-like

Usage:

Find my.regex

Résultat:

  • un nouvel onglet s'ouvre
  • chaque ligne contient un chemin relatif qui correspond à un regex grep -E
  • frappé:
    • <enter> ou <C-w>gf pour ouvrir le fichier sur la ligne en cours dans un nouvel onglet
    • gf pour ouvrir le fichier dans l'onglet en cours et perdre la liste des fichiers

Recherchez tous les fichiers à la place:

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 <buffer> <Enter> <C-W>gf
  execute 'autocmd BufEnter <buffer> lcd ' . getcwd()
endfunction
command! -nargs=1 Find call Find("find . -iname '*'" . shellescape('<args>') . "'*'")
command! -nargs=1 Gfind call Find('git ls-files | grep -E ' . shellescape('<args>'))
command! -nargs=1 Gtfind call Find('git rev-parse --show-toplevel && git ls-files | grep -E ' . shellescape('<args>'))
command! -nargs=1 Locate call Find('locate ' . shellescape('<args>'))

En fonction de votre situation (en supposant que la commande suivante ne trouve qu'un seul fichier), utilisez peut-être une commande comme:

:e `locate SomeUniqueFileName.Java`

Cela entraînera Vim à ouvrir, dans l'onglet en cours (la commande e), un fichier résultant de l'exécution (dans cet exemple), 

locate SomeUniqueFileName.Java

Notez que la magie ici réside dans les backticks autour de la commande, ce qui convertira la sortie de la commande Shell en texte utilisable dans la commande Vim.

1
Byron Katz

Je suis surpris que personne ne mentionne Unite.vim pour le moment.

La recherche de fichiers (de manière floue ou autre) n’est que la pointe de l’iceberg de ce qu’elle peut faire pour un développeur. Il a construit dans le support pour ag, git et une myriade d'autres plugins programmes/utilitaires/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 bugs sont corrigés immédiatement.

1
minusf

Command-t Dans l'un de mes plugins vim préférés, il s'agit d'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 "fuzzy" pour:

  • Ouverture de fichiers et de tampons
  • Saut aux tags et aide
  • Exécution de commandes ou recherches et commandes précédentes
  • avec un nombre minimal de frappes.

Comme vous pouvez le voir 

 enter image description here

Je cherche toujours dans l'historique des commandes en ouvrant un nouveau terminal et clique sur:

CTRL+R

Outre la recherche récursive dans tous les dossiers en écrivant dans n’importe quel onglet de terminal:

fzf

En outre, vous pouvez écrire dans vim 

:CommandT 

Vraiment puissant et rapide.

1
HMagdy

vim a bild dans des commandes nommées grep, lgrep, vimgrep ou lvimgrep pouvant le faire

voici un tutoriel sur leur utilisation 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 ...
1
Nikolaus Gradwohl

Vous pouvez trouver des fichiers de manière récursive dans votre "chemin" avec ce plugin . Il prend également en charge la complétion par tabulation pour le nom de fichier.

0
lomilomi26

l'outil ag et le plugin correspondant Ag vim résolvent parfaitement ce problème:

Pour trouver un fichier utilisant un motif, utilisez:

AgFile! pattern

Il ouvrira la fenêtre de correction rapide avec les résultats où vous pourrez choisir.

Vous pouvez ajouter vim keybinding pour appeler cette commande en utilisant Word comme motif.

nnoremap <silent> <C-h> :AgFile! '<C-R><C-W>'<CR>
vnoremap <silent> <C-h> y :AgFile! '<C-R>"'<CR>
0
aGlacier

Vous n'avez pas besoin d'un plugin uniquement pour cette fonction, l'extrait de code ci-dessous 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 <silent> <leader>fo :call FindFiles()<CR>
0
brook hong