Buffers in vim are the in-memory text of files. Your window is a viewport on a buffer. You can switch between open buffers, this is similar to tabs in other editors. Vim does have a concept of tabs too, but they are slightly different, read more about tabs in the Windows section.

I generally keep it pretty simple and just use buffers. They handle my multiple-files-open-at-the-same-time needs. You don’t have to take just my word. Here is a post about Buffers vs Tabs, and the author agrees just using buffers is easier.

Buffers tend to be the default mode for multiple files, so it is what I learned and use.

Opening Multiple Files

You can specify opening multiple files on the command-line. For example, vim *.md or vim file file fle each file opens in its own buffer.

From within vim, use :ed FILE to open additional files in new buffers.

💡If you have a command-line program that returns a list of files you want to open, use vim $(command). For example, working in a git repository, open the set of changed files using:

vim $(git diff --name-only)

Main Buffer Commands

:buffers or :ls
Show open buffers
:b {bufname}
Use buffer name, supports partial and tab completion
Close current buffer
Switch to Next buffer
Switch to Previous buffer in list
Last buffer visited, actual # sign
Switch to buffer #1
Switch to next modified buffer

Buffer Navigation

Use the above commands to navigate and switch between buffers. The :b {bufname} might be the most useful. Type :b and then start typing the filename, partials work if it is unique, or use tab completion.

My Shortcuts

Buffer navigation is so critical for my workflow, I have a set of shortcuts I use to make t it easier. I map <Leader>3 to jump back to last buffer, this makes it easy to bounce between two files.

I map <Leader>n to navigate to next buffer, I map Q to close current buffer, and map <Leader>, to open the buffer list to select a buffer.

Here is what the mappings look like in my .vimrc, see configuration section for more about mapping and leader.

" Buffer Navigation
nnoremap <Leader>3 :b#<CR>      " previous buffer
nnoremap <Leader>n :bn<CR>      " next buffer
nnoremap Q :bd!<CR>             " close buffer
nnoremap <Leader>, :Buffers<CR> " browse buffers

The :Buffers command above is slightly different and comes from the fzf.vim plugin. This allows for a more forgiving fuzzy matching of buffer names. See my article Unix is my IDE for more explanation on how I setup vim using fzf and ripgrep for advanced searching, which includes this quick way to switch buffers using fzf.

Buffer navigations

Split Buffers

You can open buffers in a split window, using the follow. This opens a second window with the buffer loaded. If you want to close the split, and keep the buffer open, use :close or ctrl-w c and not :bd. Using :bd will close the buffer, and if it is in the only buffer open in a split window, it will also close the window.

:sb 1
Open buffer #1 in a split
:sb {bufname}
Open buffer bufname in a split
Open next buffer in a split
Open previous buffer in a split
Open all buffers in split windows