I am using the Ack plugin in Vim, which helps me to quickly search for strings in my project. However, sometimes I want to replace all or some occurrences of the found strings. You can do some kind of global search and replace using the Vim arglist like this (source) :
:args app/views/*/*
:argdo %s/, :expire.*)/)/ge | update
But instead of using args
, I would prefer to do a search via Ack and then do the replace in all files that have been found. Is there a way to do it similar to the argdo
command?
I don't believe there's a built in way of doing this, but it should be easy to make one.
What you need to do is create a command that calls a custom function. The function should then use the
getqflist()
function to get all of the entries in the quickfix list andexe
to do the dirty work. Be careful what you pass as an argument!Now, Vim has this new command
cdo
that will run the given command to each line of the quickfix list.So you can use
I've decided to use ack and Perl to solve this problem outside of Vim so I could use the more powerful Perl regular expressions instead of the GNU subset. You could map this to a key stroke in your vimrc.
Explanation
ack
ack is an awesome command line tool that is a mix of
grep
,find
, and full Perl regular expressions (not just the GNU subset). Its written in pure Perl, it's fast, it has match highlighting, works on Windows and it's friendlier to programmers than the traditional command line tools. Install it on Ubuntu withsudo apt-get install ack-grep
.xargs
Xargs is an old unix command line tool. It reads items from standard input and executes the command specified followed by the items read for standard input. So basically the list of files generated by ack are being appended to the end of the
perl -pi -E 's/pattern/replacemnt/g'
command.perl -pi
Perl is a programming language. The -p option causes Perl to create a loop around your program which iterates over filename arguments. The -i option causes Perl to edit the file in place. You can modify this to create backups. The -E option causes Perl to execute the one line of code specified as the program. In our case the program is just a Perl regex substitution. For more information on Perl command line options
perldoc perlrun
. For more information on Perl see http://www.perl.org/.You could using ack by this way
Or use ag
I use MacVim (activated with
mvim
in a shell). I pipe the results ofack
tomvim
:Then in MacVim, I search/replace using
bufdo
:Omit the
c
option if confirmation is not needed.