如何在vim中搜索和替换ack?

Ral*_*den 51 vim search replace ack

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

:args app/views/*/*
:argdo %s/, :expire.*)/)/ge | update
Run Code Online (Sandbox Code Playgroud)

args我不想使用,而是希望通过Ack进行搜索,然后在找到的所有文件中进行替换.有没有办法像argdo命令一样做?

Eri*_*son 93

我已经决定使用ack和Perl来解决Vim之外的这个问题,所以我可以使用更强大的Perl正则表达式而不是GNU子集.您可以将其映射到vimrc中的键击.

ack -l 'pattern' | xargs perl -pi -E 's/pattern/replacement/g'
Run Code Online (Sandbox Code Playgroud)

说明

ACK

ACK是一个真棒的命令行工具,它是一个组合grep,find以及全Perl的正则表达式(不只是GNU子集).它以纯Perl编写,速度快,具有匹配突出显示功能,适用于Windows,对程序员来说比传统的命令行工具更友好.用Ubuntu安装它sudo apt-get install ack-grep.

xargs的

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

perl -pi

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

  • +1我稍微使用sed的解决方案,因为没有安装perl:ack -l OLD_TEXT | xargs sed -i"""s/OLD_TEXT/NEW_TEXT/g (6认同)
  • 这是很棒的东西 (5认同)
  • @sputnick,我总是习惯于使用-E,所以我可以'说'.-e当然也适用. (2认同)

roo*_*ols 36

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

所以你可以使用

:Ack pattern
:cdo s/pattern/newpattern/g
Run Code Online (Sandbox Code Playgroud)

  • `:cdo s/pattern/newpattern/g | 更新`为我工作。 (2认同)

DrA*_*rAl 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
Run Code Online (Sandbox Code Playgroud)


Ila*_*ang 10

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

:args `ack -l User app/`
:argdo %s/, :expire.*)/)/ge | update
Run Code Online (Sandbox Code Playgroud)

或者使用ag

:args `ag -l User app/`
:argdo %s/, :expire.*)/)/gec | w
Run Code Online (Sandbox Code Playgroud)


mil*_*arm 9

我使用MacVim(mvim在shell中激活).我将结果ack传递给mvim:

mvim -f $(ack -l $@)
Run Code Online (Sandbox Code Playgroud)

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

:bufdo %s/SEARCH/REPLACE/gce | update
Run Code Online (Sandbox Code Playgroud)

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