Vim搜索所有现有的缓冲区

ano*_*non 38 vim

处理单个文件时,我习惯于:

/blah
do some work
n
do some work
n
do some work
Run Code Online (Sandbox Code Playgroud)

假设现在我想在Vim中加载的所有缓冲区中搜索一些模式,对它们做一些工作,然后继续.我将为此工作流程使用哪些命令?

Kal*_*son 49

使用该bufdo命令.

:bufdo command
Run Code Online (Sandbox Code Playgroud)

:bufdo command大致相当于迭代每个缓冲区并执行命令.例如,假设您要在所有缓冲区中进行查找和替换:

:bufdo! %s/FIND/REPLACE/g
Run Code Online (Sandbox Code Playgroud)

或者假设我们要删除所有缓冲区中与正则表达式"SQL"匹配的所有文本行:

:bufdo! g/SQL/del
Run Code Online (Sandbox Code Playgroud)

或者我们可能希望在所有缓冲区上将文件编码设置为UTF-8:

:bufdo! set fenc=utf-8
Run Code Online (Sandbox Code Playgroud)

上面的内容可以推断为Windows(:windo),Tabs(:tabdo)和arguments(:argdo).有关更多信息,请参阅有关bufdo的帮助.

  • 问题是具体如何`/`搜索所有缓冲区.这个答案解释了如何跨所有缓冲区发出命令,但`/`不是命令.这适用于`/`吗? (9认同)

Tar*_*sch 33

我们可以vimgrep在argslist中使用和搜索.但首先让我们使用所有缓冲区填充argslist:

:bufdo :args ## %
Run Code Online (Sandbox Code Playgroud)

现在我们可以搜索我们的argslist

:vimgrep /blah/ ##
Run Code Online (Sandbox Code Playgroud)

哪里% == the current filepath## == the arglist.

如果你想了解更多信息,我建议观看这些vimcast:填充arglist,用vimgrep搜索多个文件

  • 谢谢!这正是我多年来一直在寻找的东西.(只是错过了`##`vimgrep参数.)我想我们也可以使用`:arga [dd]`作为替代方法在列表中添加参数. (3认同)
  • Vimgrep 将所有匹配项加载到快速列表中。`:copen` 应该显示快速列表中所有匹配的行。 (3认同)
  • 在 vim 中,`##` 是当前参数列表,`%` 是当前文件名。我们首先使用 `:%argd` 清除当前的 arglist,然后使用 `:bufdo` 将缓冲区每次添加到 arglist 中。最后,我们使用 `:vimgrep` 和 `##` 来搜索 arglist。 (2认同)

Han*_*nes 10

我有以下映射(受Vimperator启发),可以更轻松地切换上一个/下一个缓冲区.

nmap <C-P> :bp<CR>
nmap <C-N> :bn<CR>
Run Code Online (Sandbox Code Playgroud)

这对'n'非常有效.当您使用完文件后,只需按下CTRL-n然后再次点击n,然后在下一个缓冲区中搜索.重做,直到你通过所有缓冲区.


处理许多文件的另一种方法是参数列表.

它包含启动vim时作为参数传递的所有文件(例如:) vim someFile.txt someOtherFile.py.[方括号]中的文件是当前文件.

:args
[someFile.txt] someOtherFile.py
Run Code Online (Sandbox Code Playgroud)

:n将带您进入列表中的下一个文件,并且:N将带您回来.您还可以使用:argadd添加到argslist,或者使用创建新的args列表

:n some.py files.py you.py want.py to.py work.py with.py
or to open all *.py files recursively from some project.
:n ~/MyProjects/TimeMachine/**/*.py
Run Code Online (Sandbox Code Playgroud)

args列表也适用于宏(请参阅:help q),如果您对文件进行了类似的更改.只需将宏记录在第一个文件上,完成后:n移动到下一个文件,然后停止录制.

qq/searchForSomethingAndDoStuffOrWhatever:nq
Run Code Online (Sandbox Code Playgroud)

然后在所有文件(6 @ q)中运行宏,看一下确保一切顺利,然后用:wall完成.


这有点取决于你想做什么.如果您只有一个更改在许多文件中完全相同(并且那些是您加载的唯一文件),我也喜欢:ba(:tabdo sp)命令.这很快,你可以看到发生了什么.

如果你打开了一堆缓冲区,你可以加载你想要在其中工作的文件,每个文件都在一个窗口中,并对所有这些文件进行正则表达式.

CTRL-w v :b someFile
:sp anotherFile
...
:windo :%s/foo/bar/g
Run Code Online (Sandbox Code Playgroud)

我真的推荐使用FuzzyFinder,它可以让你在打开文件时轻松生活.

http://www.vim.org/scripts/script.php?script_id=1984

MMmMmmmm VIM很好!太可笑了!:)