如何在vim中search和replaceack?

我正在使用Vim中的Ack插件,这可以帮助我快速search项目中的string。 但是,有时我想要replacefind的string的所有或一些事件。 你可以做一些全局search,用这个( 源代码 )来replaceVim arglist:

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

但是,而不是使用args ,我宁愿通过Ack进行search,然后在所有已find的文件中进行replace。 有没有办法做到这一点类似于argdo命令?

我决定使用ack和Perl来解决Vim之外的这个问题,所以我可以使用function更强大的Perl正则expression式而不是GNU子集。 你可以把它映射到你的vimrc中的关键笔划。

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

说明

ACK

ack是一个令人敬畏的命令行工具,它是grepfind和perl正则expression式(不仅仅是GNU子集)的混合体。 它用纯Perl编写,速度很快,匹配突出显示,适用于Windows,比传统的命令行工具更适合程序员。 用sudo apt-get install ack-grep在Ubuntu上安装它。

xargs的

Xargs是一个老的unix命令行工具。 它从标准input读取项目并执行指定的命令,然后执行标准input读取的项目。 所以基本上由ack生成的文件列表被附加到perl -pi -E 's/pattern/replacemnt/g'命令的末尾。

perl -pi

Perl是一种编程语言。 -p选项使Perl创build一个围绕你的程序循环的文件名参数循环。 -i选项导致Perl编辑文件。 你可以修改这个来创build备份。 -E选项使Perl执行指定为程序的一行代码。 在我们的例子中,程序只是一个Perl正则expression式replace。 有关Perl命令行选项perldoc perlrun更多信息。 有关Perl的更多信息,请参见http://www.perl.org/

我不相信有这样做的内置方式,但应该很容易做到这一点。

你需要做的是创build一个调用自定义函数的命令。 然后该函数应该使用getqflist()函数获取quickfix列表中的所有条目,然后使用exe执行肮脏的工作。 要小心你作为parameter passing!

 " 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 

现在,Vim有了这个新的命令cdo ,它将运行给定的命令到quickfix列表的每一行。

所以你可以使用

 :Ack pattern :cdo s/pattern/newpattern/g 

你可以通过这种方式使用确认

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

或者使用ag

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

我使用MacVim(用mvim在shell中激活)。 我把ack的结果传给mvim

 mvim -f $(ack -l $@) 

然后在MacVim中,我使用bufdosearch/replace:

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

如果不需要确认,省略c选项。