Recherche & remplacer à l'aide de quickfix liste dans Vim
Jusqu'à présent j'ai toujours utilisé EasyGrep pour le remplacement de texte dans plusieurs fichiers. Malheureusement, il est assez lent quand un projet devient plus grande. Une chose qui semble être incroyablement rapide est Ggrep de fugitif.vim que seule la recherche de ma version contrôlée fichiers. Tous les résultats sont également stockés dans le quickfix liste.
Comment puis-je utiliser les résultats de Ggrep pour faire un simple de remplacer l'ensemble de ces fichiers trouvés? C'est en quelque sorte possible d'utiliser %s/foo/bar/cg
sur tous les fichiers dans le quickfix liste ou il y a des meilleures façons?
Vous devez vous connecter pour publier un commentaire.
Mise à jour:
Vim a maintenant
cdo
, voir Sid répondre.Réponse Originale À Cette Question:
Vim a
bufdo
,windo
,tabdo
etargdo
, qui vous permettent d'effectuer la même commande dans toutes les ouvrir tampons, windows ou les fichiers dans la liste d'arguments. Ce que nous avons vraiment besoin, c'est quelque chose commequickfixdo
, ce qui permettrait d'invoquer une commande sur chaque fichier dans le quickfix liste. Malheureusement, cette fonctionnalité est absente de Vim, mais voici une solution par Al qui fournit un laminé solution. Avec cela, il serait possible d'exécuter:Et qui irait à l'foo/bar de substitution sur tous les fichiers dans le quickfix liste.
La
bufdo
,windo
,tabdo
etargdo
commandes ont en commun certaines de comportement. Par exemple, si le fichier ne peut pas être abandonné, puis l'ensemble de ces commandes sera un échec. Je ne suis pas sûr si leQFDo
commande référencée ci-dessus suit les mêmes conventions.J'ai adapté Al solution pour créer une commande appelée
Qargs
. L'exécution de cette commande remplit l'argument de la liste avec tous les fichiers répertoriés dans le quickfix liste:En utilisant cela, vous pouvez suivre ces étapes pour faire un projet de recherche à l'échelle et de la remplacer:
Edit: (avec une astuce chapeau à Peter Rincker)
Ou vous pouvez joindre les 3 dernières commandes sur une seule ligne:
-nargs=0
et-bar
dans votreQargs
de commande.args
etargdo
! Je pense que ça pourrait être encore mieux (et plus pratique) pour rejoindreQargs
etargdo
commandes en un:command! -nargs=1 -complete=command -bang Qargdo exe 'args '.QuickfixFilenames() | argdo<bang> <args>
:Qargs
commande: github.com/nelstrom/vim-qargsQargdo
, mais commeQdo
pour moins d'achèvement de commande conflits: github.com/henrik/vim-qargshidden
besoins pour être (peut-être comme une note pour les débutants, à la fin).cdo
commande a été ajoutée! Après vous grep, vous pouvez utilisercdo
pour exécuter la commande de chaque terme dans votre quickfix liste:cdo %s/<search term>/<replace term>/cg
(Jetez un oeil à ce git commit et ce vim développeurs de google de groupe de discussion pour plus d'informations sur
cdo
et les motivations de l'ajouter.)nelstrom la réponse est assez complet et reflète sa brillante contribution à vimdom. Il va également un peu au-delà de ce qui est strictement nécessaire ici; le quickfix étape peut être omise en faveur de remplissage args avec le résultat d'une commande shell:
devrait être tout ce dont vous avez besoin.
Edit: comme Domon notes :jeu de caché qui doit être fait d'abord si elle n'est pas déjà réglé!
vim `git grep -l findme`
:set hidden
avant:argo ...
ou Vim donne des erreurs en raison de modifications non enregistrées.Externe grep
(utilise grepprg, grepformat comme dans makeprg/errorformat; si grepprg=='interne' c'est identique à l'interne grep)
Interne grep
etc.
De la liste des emplacements internes grep
etc.
Bonus: faire de l'externe grep pour le chargé de tampons:
etc.
Externe pour tous les arguments:
À l'aide de quickfix-réflecteur.vim, vous pouvez modifier les résultats de votre recherche dans le quickfix fenêtre. Le
write
commande puis enregistrer les modifications apportées à vos fichiers.Il y a un patch pour ajouter le cdo (Quickfix ne) de commande de vim, mais il n'a pas été tiré encore (comme de 2015-03-25):
https://groups.google.com/forum/#!topic/vim_dev/dfyt-G6SMec
Vous pouvez patch vim vous-même pour obtenir ce patch: