Vim searching through all existing buffers

2020-05-19 04:04发布

When dealing with a single file, I'm used to:

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

Suppose now I want to search for some pattern over all buffers loaded in Vim, do some work on them, and move on. What commands do I use for this work flow?

标签: vim
8条回答
地球回转人心会变
2楼-- · 2020-05-19 04:28

Use the bufdo command.

:bufdo command

:bufdo command is roughly equivalent to iterating over each buffer and executing command. For example, let's say you want to do a find and replace throughout all buffers:

:bufdo! %s/FIND/REPLACE/g

Or let's say we want to delete all lines of text that match the regex "SQL" from all buffers:

:bufdo! g/SQL/del

Or maybe we want to set the file encoding to UTF-8 on all the buffers:

:bufdo! set fenc=utf-8

The above can be extrapolated for Windows (:windo), Tabs (:tabdo), and arguments (:argdo). See help on :bufdo for more information.

查看更多
Anthone
3楼-- · 2020-05-19 04:28

We can do this using vimgrep and searching across the argslist. But first let's populate our argslist with all our buffers:

:bufdo :args ## %

Now we can search in our argslist

:vimgrep /blah/ ##

Where % == the current filepath and ## == the arglist.

I recommend watching these vimcasts if you want to learn more: Populate the arglist, Search multiple files with vimgrep

查看更多
Evening l夕情丶
4楼-- · 2020-05-19 04:30

I have the following mappings (inspired by Vimperator) that make switching previous/next buffer easier.

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

This works really well with 'n'. When you're done working with your file, just hit CTRL-n before hitting n again and you're searching in the next buffer. Redo until you're through all buffers.


Another way of working with many files is the argument list.

It contains any files passed as parameters when you started vim (e.g: vim someFile.txt someOtherFile.py). The file within [brackets] is the current file.

:args
[someFile.txt] someOtherFile.py

:n will bring you to the next file in the list and :N will bring you back. You can also add to the argslist with :argadd, or create a new args list with

: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

The args list work well with macros too (see :help q), if you have similar changes to your files. Just record your macro on the first file, finish with :n to move to the next file, and stop recording.

qq/searchForSomethingAndDoStuffOrWhatever:nq

Then run your macro through all files (6@q), have a look to make sure everything went well, and finish with a :wall.


It kinda depends on what you want to do. If you just have one change that is exactly the same across many files (and those are the only ones you have loaded), I also like the :ba (:tabdo sp) command. It's very quick and you can see what's happening.

And if you have a bunch of buffers open, you can load up the files you want to work within, each in a window, and do a regexp on all of them.

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

I really recommend FuzzyFinder, it makes your life a lot easier when opening files.

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

MMmMmmmm VIM IS NICE! SO SEXY! : )

查看更多
smile是对你的礼貌
5楼-- · 2020-05-19 04:30

I don't believe it's possible to extend the 'n' functionanly across files or buffers. You could use

:grep blah *

And then do

:cn

To move to the next line with blah on it. That will switch between files but it's not quite as neat. It's more cumbersome to type the colon all the time, and it will only take you to the line, not the word.

What I usually do is either to open the files I want to searched in tabs and then use 'n' and 'gt' to jump to next tab when I reach the end of the file, or list the files on the command line to I can skip to the next file with ':wn' when I'm done editing it.

Hope it helps!

查看更多
放我归山
6楼-- · 2020-05-19 04:37

Here is your gospel: https://github.com/jeetsukumaran/vim-buffersaurus

This lovely plugin shows you all the files that match your query in a separate window, from which you can choose. It support regex.

查看更多
趁早两清
7楼-- · 2020-05-19 04:48

Anytime you want to switch to another buffer try this.

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

For an example. I have this in my buffer

77 "/var/www/html/TopMenuAlertAlert.vue" line 65
78 "/var/www/html/MainSidebar.vue" line 29
79 "/var/www/html/FullScreenSearch.vue" line 26
80 "/var/www/html/Menu.vue" line 93
81 "/var/www/html/layouts/RightSidebar.vue" line 195

As I want to change to another buffer, I probably remember some detail about the file like 'Alert'

So I just go

:b Alert + tab

if the file given is not the one I want, I just keep on pressing tab.

Vim will keep on giving the next file close to it.

Once you got it. Press Enter.

查看更多
登录 后发表回答