处理单个文件时,我习惯了:
/blah
do some work
n
do some work
n
do some work
现在假设我想在Vim中加载的所有缓冲区中搜索某些模式,对它们进行一些处理,然后继续。我将为此工作流程使用哪些命令?
答案 0 :(得分:46)
使用bufdo
命令。
:bufdo command
:bufdo command
大致相当于迭代每个缓冲区并执行命令。例如,假设你想在所有缓冲区中进行查找和替换:
:bufdo! %s/FIND/REPLACE/g
或者说我们要删除所有缓冲区中与正则表达式“SQL”匹配的所有文本行:
:bufdo! g/SQL/del
或许我们想在所有缓冲区上将文件编码设置为UTF-8:
:bufdo! set fenc=utf-8
以上内容可以推断为Windows(:windo
),Tabs(:tabdo
)和参数(:argdo
)。有关更多信息,请参阅有关bufdo的帮助。
答案 1 :(得分:29)
我们可以使用vimgrep
执行此操作并搜索argslist。但首先让我们用我们所有的缓冲区填充我们的argslist:
:bufdo :args ## %
现在我们可以搜索我们的argslist
:vimgrep /blah/ ##
% == the current filepath
和## == the arglist
。
如果您想了解更多内容,我建议观看这些vimcast:Populate the arglist,Search multiple files with vimgrep
答案 2 :(得分:10)
我有以下映射(受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将带您回来。您还可以使用: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
如果您对文件进行了类似的更改,那么args列表也适用于宏(请参阅:help q)。只需在第一个文件上录制宏,最后用:n移动到下一个文件,然后停止录制。
qq/searchForSomethingAndDoStuffOrWhatever:nq
然后在所有文件中运行你的宏(6 @ q),看一下确保一切顺利,然后用:wall完成。
这有点取决于你想做什么。如果您只有一个更改在许多文件中完全相同(并且那些是您加载的唯一文件),我也喜欢: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很好!太可笑了! :)
答案 3 :(得分:2)
这是你的福音: https://github.com/jeetsukumaran/vim-buffersaurus
这个可爱的插件会在一个单独的窗口中显示与您的查询匹配的所有文件,您可以从中选择。它支持正则表达式。
答案 4 :(得分:1)
我不相信可以跨文件或缓冲区扩展'n'功能。你可以用
:grep blah *
然后再做
:cn
用blah移动到下一行。这将在文件之间切换,但它不是那么整洁。输入冒号总是比较麻烦,它只会带你去行,而不是单词。
我通常做的是在标签中打开我想要搜索的文件,然后在到达文件末尾时使用“n”和“gt”跳转到下一个标签,或者在命令中列出文件当我完成编辑时,我可以用':wn'跳到下一个文件。
希望它有所帮助!
答案 5 :(得分:0)
我将使用以下两个命令在新选项卡中打开所有缓冲区:
:tab sp
:bufdo sp
然后逐个搜索每个文件并在完成后关闭其窗口(使用:q
或:close
)。使用 CTRL + W _ 可以在使用时最大化每个窗口。当您完成并关闭最后一个窗口时,标签页将关闭,您将在决定进行搜索之前将其放回原处。
答案 6 :(得分:0)
任何时候你想切换到另一个缓冲区试试这个。
:b + <any part of file in buffer> + tab
举个例子。我在缓冲区中有这个
77“/var/www/html/TopMenuAlertAlert.vue”第65行 78“/var/www/html/MainSidebar.vue”第29行 79“/var/www/html/FullScreenSearch.vue”第26行 80“/var/www/html/Menu.vue”第93行 81“/var/www/html/layouts/RightSidebar.vue”第195行
由于我想换到另一个缓冲区,我可能还记得有关该文件的一些细节,如'Alert'
所以我去了
:b Alert + tab
如果给出的文件不是我想要的文件,我只需按下标签。
Vim将继续提供接近它的下一个文件。
一旦你得到它。按Enter键。
答案 7 :(得分:0)
另一种方法:
:call setqflist([]) " clear quickfix list
:silent bufdo grepadd! foo % " edit foo in command-line history window
:cw " view search results
或映射:
cmap bbb call setqflist([]) \| silent bufdo grepadd! %<C-F>$hha