在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是一个令人敬畏的命令行工具,它是grep
, find
和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的所有子目录下的所有文件中查找(vim
是vimgrep
的缩写)模式,而不会触发: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个命令。
链接
- :h {arglist} – vimdoc.sourceforge.net/htmldoc/editing.html#{arglist}
- ack – betterthangrep.com/
- ack.vim – github.com/mileszs/ack.vim
- 逃犯 – 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插件:
如果你不介意引入外部依赖,我已经酿造了一个插件ctrlsf.vim (取决于ack或ag )来完成这项工作。
它可以格式化并显示来自ack / ag的search结果,并将结果缓冲区中的更改同步到磁盘上的实际文件。
也许下面的演示解释更多
基本上,我希望在一个命令中更换,更重要的是在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中