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?
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.
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)
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:
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.
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
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.
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 .
Vous pouvez utiliser ! pour exécuter des commandes Shell:
:! find . -name *.xml
Résultat de type Quickfix-like
Usage:
Find my.regex
Résultat:
grep -E
<enter>
ou <C-w>gf
pour ouvrir le fichier sur la ligne en cours dans un nouvel ongletgf
pour ouvrir le fichier dans l'onglet en cours et perdre la liste des fichiersRecherchez tous les fichiers à la place:
Find
Méthodes alternatives:
Gfind my.regex
: recherche uniquement les fichiers suivis par Git (git ls-files
). Demande fugitive: https://github.com/tpope/vim-fugitive/issues/132#issuecomment-200749743Gtfind my.regex
: like Gfind
, mais recherchez dans le répertoire git Top au lieu du répertoire actuelLocate somefile
: locate
versionCode:
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.
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.
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:
Comme vous pouvez le voir
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.
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 ...
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.
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>
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>