2010-03-15 68 views
26

当一个文件处理搜索,我已经习惯了:Vim的通过现有的所有缓冲区

/blah 
do some work 
n 
do some work 
n 
do some work 

假设现在我要搜索超过一些模式在Vim中加载的所有缓冲区,做一些工作在他们身上,继续前进。我为这个工作流使用了什么命令?

回答

9

我有以下映射(灵感来自Vimperator),使切换上一个/下一个缓冲区更容易。

nmap <C-P> :bp<CR> 
nmap <C-N> :bn<CR> 

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


处理很多文件的另一种方式是参数列表。

它包含在启动vim时作为参数传递的任何文件(例如:vim someFile.txt someOtherFile.py)。 [括号]内的文件是当前文件。

:args 
[someFile.txt] someOtherFile.py 

:n会带你到列表中的下一个文件,并且:N会带你回来。您还可以添加与argslist:argadd,或太创建一个新的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 

与宏的args列表做工精良(见:帮助Q),如果你有你的文件类似的变化。只需在第一个文件上记录宏,然后按:n移至下一个文件并停止记录。

qq/searchForSomethingAndDoStuffOrWhatever:nq 

然后通过所有文件(6 @ Q)运行宏,看看,以确保一切顺利,并用完成:墙。


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

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

CTRL-w v :b someFile 
:sp anotherFile 
... 
:windo :%s/foo/bar/g 

我真的推荐FuzzyFinder,它会让你的生活在打开文件的时候容易得多。

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

MMMMMMMM VIM是好的!性感! :)

38

使用bufdo命令。

:bufdo command 

:bufdo command大致等价于迭代每个缓冲区并执行命令。例如,假设你想要做一个查找和贯穿所有的缓冲区替换:

:bufdo! %s/FIND/REPLACE/g 

还是让我们说,我们要删除匹配来自所有的缓冲区正规表达式“SQL”文本中的所有行:

:bufdo! g/SQL/del 

或者,也许我们要设置文件编码成UTF-8上的所有缓存:

:bufdo! set fenc=utf-8 

以上可以推断为Windows(:windo),标签(:tabdo)和参数(:argdo)。查看关于bufdo的帮助以获取更多信息。

+1

看看这里http://vim.wikia.com/wiki/Run_a_command_in_multiple_buffers – Rod 2012-11-14 17:03:04

+0

这不是一个好的答案。即使它是正确的,它也需要通过评论来查看,然后通过可能提供也可能不提供答案的文档进行拖网。看到一位资深SO用户以这种方式回答问题令人失望。 – arman 2014-09-26 13:40:04

+1

我已经添加了一些我希望有用的示例和说明。如果您仍然认为它缺少某些东西,请告诉我。 – 2014-10-01 18:43:30

1

我不认为有可能在文件或缓冲区中扩展'n'函数。你可以使用

:grep blah * 

然后做

:cn 

移动到与它嗒嗒下一行。这将在文件之间进行切换,但并不完美。键入冒号总是更麻烦,它只会把你带到线上,而不是单词。

我通常要做的是打开我想要在标签中搜索的文件,然后使用'n'和'gt'跳转到下一个标签,当我到达文件的末尾,或者列出文件命令行我可以在编辑完成后跳到下一个带有':wn'的文件。

希望它有帮助!

0

我会使用以下两条命令打开新的标签页所有缓冲区:

:tab sp 
:bufdo sp 

当您完成通过每个文件逐一然后搜索并关闭它的窗口(使用:q:close)。使用CTRL + W_可最大化每个窗口,因为您正在使用它。当您完成并关闭最后一个窗口时,选项卡页面将关闭,无论您身在何处,您将决定执行搜索。

21

我们可以使用vimgrep并在argslist中进行搜索。但首先让我们填充argslist与我们所有的缓冲区:

:bufdo :args ## % 

现在我们可以在我们的argslist

:vimgrep /blah/ ## 

% == the current filepath## == the arglist搜索。

我建议关注这些vimcasts如果您想了解更多:Populate the arglist,你要切换到另一个缓冲区Search multiple files with vimgrep

+2

谢谢!这正是我多年来一直在寻找的东西。 (只是缺少'##'vimgrep参数。)我想我们也可以使用':arga [dd]'将参数添加到列表中。 – 2016-01-28 19:19:59

+0

在vim中'##'是当前的参数列表,'%'是当前的文件名。我们首先用':%argd'清除当前的参数列表,然后使用':bufdo'将缓冲区一次添加到参数列表中。最后,我们使用':vimgrep'和'##'来搜索arglist。 – JPaget 2016-09-01 20:43:44

0

任何时候试试这个。

:b + <any part of file in buffer> + tab 

举一个例子。我有这在我的缓冲

77 “/var/www/html/TopMenuAlertAlert.vue” 线65
78 “/var/www/html/MainSidebar.vue” 线29
79“/无功/www/html/FullScreenSearch.vue”线26
80 “/var/www/html/Menu.vue” 线93
81 “/var/www/html/layouts/RightSidebar.vue” 线195

正如我想改变到另一个缓冲区,我可能还记得有关文件的一些细节,如'警报'

所以我只是去

:b Alert + tab 

如果给定的文件是不是就是我想要的,我只是不断的压片。

Vim将继续提供接近它的下一个文件。

一旦你得到它。按Enter键。

相关问题