在Vim中search并replace所有项目文件

我正在寻找在Vim中的所有项目文件中进行search和replace(有确认)的最佳方法。 “项目文件”是指当前目录中的文件,其中一些文件不必打开。

一种方法是打开当前目录中的所有文件:

:args ./** 

然后在所有打开的文件上进行search和replace:

 :argdo %s/Search/Replace/gce 

但是,当我这样做时,Vim的内存使用量从几十MB跳到2 GB以上,这对我来说并不合适。

我也安装了EasyGrep插件,但是它几乎不能正常工作 – 要么是没有find所有的事件,要么就是挂起,直到我按下Ctrl C。 到目前为止,我们首选的方式来完成这个任务它确认search术语,使用它的quickfix窗口打开任何文件,包含术语,并没有打开之前,最后:bufdo %s/Search/Replace/gce

我正在寻找一个好的,可用于此的工作插件,或者是一个比现在使用的命令更容易的命令/命令序列。

Greplace适合我。

github上还有一个病原体准备好的版本 。

这里的另一个大select就是不使用vim:

 sed -i 's/pattern/replacement/' <files> 

或者如果你有一些生成文件列表的方式,可能是这样的:

 find . -name *.cpp | xargs sed -i 's/pattern/replacement/' grep -rl 'pattern1' | xargs sed -i 's/pattern2/replacement/' 

等等!

我决定使用ack和Perl来解决这个问题,以便利用function更强大的完整Perl正则expression式而不是GNU子集。

 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/

也许这样做:

 :noautocmd vim /Search/ **/* :set hidden :cfirst qa :%s//Replace/gce :cnf q 1000@a :wa 

说明:

  • :noautocmd vim /Search/ **/* ⇒在cwd的所有子目录下的所有文件中查找( vimvimgrep的缩写)模式,而不会触发:noautocmd:noautocmd ),这是为了速度。
  • :set hidden ⇒允许修改的缓冲区不显示在窗口中(可能在你的vimrc中)
  • :cfirst跳转到第一个search结果
  • qa开始将macroslogging到寄存器a中
  • :%s//Replace/gce代替所有出现的最后一次search模式(仍然/Search/当时)
    • 同一行几次( g标志)
    • 与用户确认( c标志)
    • 如果没有发现模式( e标志)没有错误
  • :cnf跳转到由vim命令创build的列表中的下一个文件
  • q⇒停止录制macros
  • 1000@a a⇒播放存储在寄存器1000中的macros
  • :wa保存所有修改的缓冲区

*编辑* Vim 8种方式:

从Vim 8开始,有一个更好的方法来做到这一点,例如:cfdo迭代quickfix列表中的所有文件:

 :noautocmd vim /Search/ **/* :set hidden :cfdo %s//Replace/gce :wa 

填充:args来自shell命令的:args

有可能(在某些操作系统上)通过shell命令提供:args的文件。

例如,如果您安装了ack 2

 :args `ack -l pattern` 

会要求ack返回一个包含'pattern'的文件列表,并把它们放在参数列表中。

或者与普通的醇'我猜想它会是:

 :args `grep -lr pattern .` 

然后你可以使用:argdo OP描述的:argdo

 :argdo %s/pattern/replacement/gce 

填充:args来自quickfix列表的:args

另外请查看nelstrom对相关问题的回答 ,描述一个简单的用户自定义命令,该命令从当前的quickfix列表中填充arglist。 这对许多命令和插件的输出结果在quickfix列表( :vimgrep:Ack 3:Ggrep 4 )中都有效。

执行项目范围search的顺序可以通过以下方式完成:

 :vimgrep /pattern/ **/* :Qargs :argdo %s/findme/replacement/gc 

其中:Qargs是从quickfix列表中填充arglist的用户定义命令的调用。

在接下来的讨论中 ,您还可以find简单的插件,将这个工作stream程缩减为2或3个命令。

链接

  1. :h {arglist} – vimdoc.sourceforge.net/htmldoc/editing.html#{arglist}
  2. ack – betterthangrep.com/
  3. ack.vim – github.com/mileszs/ack.vim
  4. 逃犯 – github.com/tpope/vim-fugitive

感谢最近添加的cdo命令 ,现在可以使用您安装的任何grep工具通过两个简单的命令执行此操作。 不需要额外的插件!

 1. :grep <search term> 2. :cdo %s/<search term>/<replace term>/gc 3. (If you want to save the changes in all files) :cdo update 

cdo对quickfix列表中的每个项执行给定的命令, grep命令填充该项)。

(如果要在不确认每次的情况下replace每个search词,请删除第二个命令末尾的c

2016年的另一个选项, far.vim插件:

far.vom

如果你不介意引入外部依赖,我已经酿造了一个插件ctrlsf.vim (取决于ack或ag )来完成这项工作。

它可以格式化并显示来自ack / ag的search结果,并将结果缓冲区中的更改同步到磁盘上的实际文件。

也许下面的演示解释更多

ctrlsf_edit_demo

基本上,我希望在一个命令中更换,更重要的是在vim中

根据@Jefromi的回答,我创build了一个键盘快捷键,这个快捷键是我在.vimrc文件中设置的

 nmap <leader>r :!grep -r -l * \| xargs sed -i -e 's///g' 

现在从vim开始,在leader + r的笔画上我得到了在vim中加载的命令,我编辑如下,

 :!grep -r -l <find> <file pattern> | xargs sed -i -e 's/<find>/<replace>/g' 

因此,我用一个命令replace,更重要的是在vim中