如何在Vim中搜索和替换为ack?

我在Vim中使用了Ack插件,它可以帮助我在项目中快速搜索字符串。 但是,有时我想替换所有或部分出现的找到的字符串。 您可以像这样使用Vim arglist进行某种全局搜索并替换(源代码):

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

但是,我宁愿不使用2724700286278435435840,而是通过Ack进行搜索,然后在找到的所有文件中进行替换。 有没有一种类似于argdo命令的方法?

Ralph von der Heyden asked 2020-01-30T00:01:42Z
5个解决方案
93 votes

我决定使用ack和Perl在Vim之外解决此问题,因此我可以使用功能更强大的Perl正则表达式代替GNU子集。 您可以将此映射到vimrc中的按键。

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

说明

确认

ack是一个很棒的命令行工具,它混合了perldoc perlrunfind和完整的Perl正则表达式(不仅仅是GNU子集)。 它使用纯Perl编写,速度快,具有突出显示的匹配项,可在Windows上运行,并且与传统命令行工具相比对程序员更友好。 使用sudo apt-get install ack-grep在Ubuntu上安装它。

xargs

Xargs是旧的UNIX命令行工具。 它从标准输入读取项目,并执行指定的命令,然后执行为标准输入读取的项目。 因此,基本上,由ack生成的文件列表将附加到perldoc perlrun命令的末尾。

perl -pi

Perl是一种编程语言。 -p选项使Perl在您的程序周围创建一个循环,该循环遍历文件名参数。 -i选项使Perl在适当位置编辑文件。 您可以修改它以创建备份。 -E选项使Perl执行指定为程序的一行代码。 在我们的例子中,该程序只是Perl regex的替代品。 有关Perl命令行选项perldoc perlrun的更多信息。有关Perl的更多信息,请参见[http://www.perl.org/。]

Eric Johnson answered 2020-01-30T00:02:38Z
36 votes

现在,Vim有这个新命令cdo,它将在快速修复列表的每一行运行给定命令。

所以你可以使用

:Ack pattern
:cdo s/pattern/newpattern/g
rools answered 2020-01-30T00:03:02Z
16 votes

我不相信有内置的方法可以做到这一点,但是要做到这一点应该很容易。

您需要做的是创建一个调用自定义函数的命令。 然后,该函数应使用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
DrAl answered 2020-01-30T00:03:27Z
10 votes

您可以通过这种方式使用ack

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

或使用ag

:args `ag -l User app/`
:argdo %s/, :expire.*)/)/gec | w
Ilake Chang answered 2020-01-30T00:03:51Z
9 votes

我使用MacVim(在外壳中用mvim激活)。 我将c的结果传递给mvim

mvim -f $(ack -l $@)

然后在MacVim中,我使用c搜索/替换:

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

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

milkfarm answered 2020-01-30T00:04:20Z
translate from https://stackoverflow.com:/questions/4792561/how-to-do-search-replace-with-ack-in-vim