Il y a plusieurs moyens de le faire.
Dans le répertoire actuel
Si vous souhaitez effectuer la recherche / remplacement dans une arborescence de projet, vous pouvez utiliser la liste d'arguments de Vim .
Ouvrez simplement Vim puis utilisez la :args
commande pour remplir la liste des arguments. Vous pouvez transmettre plusieurs noms de fichiers ou même des globs.
Par exemple, :args **/*.rb
cherchera de manière récursive dans le répertoire actuel les fichiers ruby. Notez que c'est aussi comme ouvrir Vim avec vim **/*.rb
. Vous pouvez même utiliser la find
commande du shell pour obtenir une liste de tous les fichiers du répertoire actuel en exécutant:
:args `find . -type f`
Vous pouvez afficher la liste des arguments en cours :args
en s'exécutant tout seul. Si vous souhaitez ajouter ou supprimer des fichiers de la liste, vous pouvez utiliser :argadd
les :argdelete
commandes ou respectivement.
Une fois que vous êtes satisfait de la liste, vous pouvez maintenant utiliser la puissante :argdo
commande de Vim qui exécute une commande pour chaque fichier de la liste d'arguments::argdo %s/search/replace/g
Voici quelques astuces de recherche (basées sur certains commentaires):
- Utilisez une limite de mot si vous voulez rechercher "foo" mais pas "foo_bar". Utilisez les constructions
\<
et \>
autour du motif de recherche comme suit::argdo %s/\<search\>/foobar/g
- Utilisez un
/c
indicateur de recherche si vous souhaitez que Vim demande une confirmation avant de remplacer un terme de recherche.
- Utilisez un
/e
indicateur de recherche si vous souhaitez ignorer les erreurs "modèle non trouvé".
- Vous pouvez également choisir d'enregistrer le fichier après avoir effectué la recherche:
:argdo %s/search/replace/g | update
. Ici, :update
est utilisé car il ne sauvegardera le fichier que s’il a changé.
Tampons ouverts
Si vous avez déjà des tampons ouverts sur :bufdo
lesquels vous souhaitez effectuer la recherche / remplacement, vous pouvez utiliser une commande pour exécuter une commande pour chaque fichier de votre liste de tampons ( :ls
).
La commande est très similaire à :argdo
: :bufdo %s/search/replace/g
Semblable à :argdo
et :bufdo
, il existe :windo
et :tabdo
agit sur les fenêtres et les onglets respectivement. Ils sont moins souvent utilisés mais restent utiles à connaître.
/c
drapeau pour confirmer les substitutions.\<
et\>
dusearch
pour éviter le remplacement partiel des mots.:cd %:p:h
. Les autres options du répertoire de travail sont répertoriées dans vim.wikia.com/wiki/Set_working_directory_to_the_current_file .Disons que nous avons une structure de projet simple comme celle-ci:
greeting.txt ressemble à
et info / age.txt ressemble à
Disons que nous voulons remplacer toutes les occurrences de Sam par Bob. Voici ce que nous ferions:
Définir le répertoire de travail
Assurez-vous que le répertoire de travail actuel de Vim est la racine du projet (il ne vous montrera pas comment faire cela ici).
Trouver les fichiers contenant 'Sam'
Utilisez la commande vimgrep de Vim pour rechercher toutes les occurrences de Sam dans le projet (note: les
**/*
recherches dans tous les fichiers de manière récursive).Cela remplira la liste de correctifs avec toutes les instances de Sam. Si vous souhaitez afficher la liste des correctifs rapides, vous pouvez utiliser la commande Vim.
:copen
Substituer dans tous les fichiers contenant «Sam»
Maintenant, nous voulons exécuter la commande de substitution de Vim dans chaque fichier de la liste des correctifs. Nous pouvons le faire en utilisant la
:cfdo {cmd}
commande qui exécute {cmd} dans chaque fichier de la liste des correctifs. Le {cmd} spécifique que nous voulons utiliser estsubstitute
ous
pour faire court. La ligne complète ressemblerait à ceci:Vous pouvez ajouter le drapeau c pour confirmer tous les remplacements si vous le souhaitez:
Enregistrer tous les fichiers
la source
cfdo %s/Sam/Bob/g | update
quihidden
option avec:set hidden
si vous ne l'avez pas déjà fait.Bien que ce ne soit pas une solution VIM, si vous utilisez VI / VIM, il peut être plus facile d’utiliser une solution CLI. Pour changer tous les fichiers du répertoire en cours, utilisez-le
perl
comme il a été fait pour des situations comme celle-ci:Si vous avez également besoin de le faire dans des sous-répertoires, j’appareille généralement
perl
avecfind
:La bonne chose à propos de cela est que vous pouvez facilement affiner la liste en fonction de types de fichiers spécifiques. Par exemple, pour limiter les fichiers python:
la source
Pour remplacer une phrase par une autre, vous pouvez utiliser le mode Vim Ex.
Par exemple (
ex
alias tovim -E
):Récursivement dans bash / zsh (avec
globstar
set, par exempleshopt -s globstar
):Récursivement (en utilisant
find
et ignorer les fichiers cachés tels que les.git
fichiers):Remarque: la
:bufdo
commande n'est pas POSIX .Remarque: La syntaxe
-not -path '*/\.*'
est utilisée pour ignorer les fichiers cachés (tels que.git
).la source
Voici la commande shell utilisant
find
etex
editor (sans utiliser:bufdo
):Cela éditera tous les
*.rb
fichiers du dossier actuel (de manière récursive) et les remplacerafoo
parbar
.la source