60 votes

Comment faire une recherche et remplacer avec ack dans vim?

Je suis à l'aide de l'accusé de réception plugin Vim, qui m'aide à trouver rapidement des chaînes dans mon projet. Cependant, parfois, j'ai envie de remplacer l'ensemble ou de certaines occurrences de chaînes trouvées. Vous pouvez faire un peu de type de recherche et de remplacement à l'aide de Vim arglist comme ceci (source) :

:args app/views/*/*
:argdo %s/, :expire.*)/)/ge | update

Mais au lieu d'utiliser args, je préfère faire une recherche à partir d'accusé de réception et ensuite faire le remplacer dans tous les fichiers qui ont été trouvés. Est-il un moyen de le faire semblable à l' argdo commande?

98voto

Eric Johnson Points 5217

J'ai décidé d'utiliser accusé de réception et Perl pour résoudre ce problème en dehors de Vim afin que je puisse utiliser le plus puissant des expressions régulières de Perl au lieu de la GNU sous-ensemble. Vous pouvez mapper ce pour une touche dans votre vimrc.

ack -l 'pattern' | xargs perl -pi -E 's/pattern/replacement/g'

Explication

ack

ack est un super outil de ligne de commande qui est un mélange de grep, find, et plein d'expressions régulières de Perl (et pas seulement de la GNU sous-ensemble). Ses écrits en pur Perl, il est rapide, il a de correspondance mettant en évidence, fonctionne sur Windows et c'est plus convivial pour les programmeurs que les traditionnels outils de ligne de commande. L'installer sur Ubuntu avec sudo apt-get install ack-grep.

xargs

Xargs est un vieux unix outil de ligne de commande. Il lit les éléments à partir de l'entrée standard et exécute la commande spécifiée suivie par les éléments de lecture de l'entrée standard. Donc, fondamentalement, la liste des fichiers générés par ack sont ajoutés à la fin de l' perl -pi -E 's/pattern/replacemnt/g' commande.

perl -pi

Perl est un langage de programmation. L'option-p causes Perl pour créer une boucle autour de votre programme qui parcourt plus de nom de fichier arguments. L'option-i causes de Perl à éditer le fichier en place. Vous pouvez modifier cette option pour créer des sauvegardes. L'option-E causes Perl pour exécuter une ligne de code spécifié que le programme. Dans notre cas, le programme est tout simplement une expression rationnelle Perl substitution. Pour plus d'informations sur Perl options de ligne de commande perldoc perlrun. Pour plus d'informations sur Perl voir http://www.perl.org/.

16voto

DrAl Points 29528

Je ne crois pas qu'il y ait une manière intégrée de faire cela, mais il devrait être facile d'en créer un.

Ce que vous devez faire est de créer une commande qui appelle une fonction personnalisée. La fonction doit ensuite utiliser la fonction getqflist() pour obtenir toutes les entrées de la liste des correctifs rapides et exe pour effectuer le travail incorrect. Faites attention à ce que vous transmettez comme argument!

 " Define a command to make it easier to use
command! -nargs=+ QFDo call QFDo(<q-args>)

" Function that does the work
function! QFDo(command)
    " Create a dictionary so that we can
    " get the list of buffers rather than the
    " list of lines in buffers (easy way
    " to get unique entries)
    let buffer_numbers = {}
    " For each entry, use the buffer number as 
    " a dictionary key (won't get repeats)
    for fixlist_entry in getqflist()
        let buffer_numbers[fixlist_entry['bufnr']] = 1
    endfor
    " Make it into a list as it seems cleaner
    let buffer_number_list = keys(buffer_numbers)

    " For each buffer
    for num in buffer_number_list
        " Select the buffer
        exe 'buffer' num
        " Run the command that's passed as an argument
        exe a:command
        " Save if necessary
        update
    endfor
endfunction
 

10voto

Ilake Chang Points 569

Vous pouvez utiliser ack de cette façon

 :args `ack -l User app/`
:argdo %s/, :expire.*)/)/ge | update
 

Ou utilisez ag

 :args `ag -l User app/`
:argdo %s/, :expire.*)/)/gec | w
 

9voto

milkfarm Points 128

J'utilise MacVim (activé avec mvim dans un shell). Je transmets les résultats de ack à mvim :

 mvim -f $(ack -l $@)
 

Puis dans MacVim, je recherche / remplace en utilisant bufdo :

 :bufdo %s/SEARCH/REPLACE/gce | update
 

Omettez l'option c si la confirmation n'est pas nécessaire.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X