我在Vim中使用Ack插件,这有助于我快速搜索项目中的字符串。但是,有时我想替换找到的字符串的全部或部分出现。您可以使用像这样的Vim arglist进行某种全局搜索和替换(source) :
:args app/views/*/*
:argdo %s/, :expire.*)/)/ge | update
但是我不想使用args
,而是希望通过Ack进行搜索,然后在找到的所有文件中进行替换。有没有办法与argdo
命令类似?
答案 0 :(得分:92)
我决定使用ack和Perl来解决Vim之外的这个问题,所以我可以使用更强大的Perl正则表达式而不是GNU子集。您可以将其映射到vimrc中的键击。
ack -l 'pattern' | xargs perl -pi -E 's/pattern/replacement/g'
ack是一个很棒的命令行工具,它混合了grep
,find
和完整的Perl正则表达式(不仅仅是GNU子集)。它以纯Perl编写,速度快,具有匹配突出显示功能,适用于Windows,对程序员来说比传统的命令行工具更友好。使用sudo apt-get install ack-grep
在Ubuntu上安装它。
Xargs是一个旧的unix命令行工具。它从标准输入读取项目并执行指定的命令,然后执行标准输入读取的项目。因此,ack生成的文件列表基本上被附加到perl -pi -E 's/pattern/replacemnt/g'
命令的末尾。
Perl是一种编程语言。 -p选项使Perl在程序周围创建一个循环,该循环遍历文件名参数。 -i选项使Perl在适当的位置编辑文件。您可以修改它以创建备份。 -E选项使Perl执行指定为程序的一行代码。在我们的例子中,该程序只是一个Perl正则表达式替换。有关Perl命令行选项perldoc perlrun
的更多信息。有关Perl的更多信息,请参阅http://www.perl.org/。
答案 1 :(得分:34)
现在,Vim有了这个新命令cdo
,它将命令运行给quickfix列表的每一行。
所以你可以使用
:Ack pattern
:cdo s/pattern/newpattern/g
答案 2 :(得分:16)
我不相信有这样做的内置方式,但它应该很容易制作。
您需要做的是创建一个调用自定义函数的命令。然后,该函数应使用getqflist()
函数来获取quickfix列表中的所有条目,并exe
执行脏工作。你要小心作为一个论点!
" 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
答案 3 :(得分:10)
你可以通过这种方式使用ack
:args `ack -l User app/`
:argdo %s/, :expire.*)/)/ge | update
或使用ag
:args `ag -l User app/`
:argdo %s/, :expire.*)/)/gec | w
答案 4 :(得分:9)
我使用MacVim(在shell中使用mvim
激活)。我将ack
的结果导入mvim
:
mvim -f $(ack -l $@)
然后在MacVim中,我使用bufdo
搜索/替换:
:bufdo %s/SEARCH/REPLACE/gce | update
如果不需要确认,请省略c
选项。