How can I close a buffer without closing the window?

I messed with this a bit and finally came up with:

:bp | sp | bn | bd

Here's the copy/paste version for key mapping:

:bp<bar>sp<bar>bn<bar>bd<CR>

I've tested it a fair bit and it works consistently in various conditions. When used on the last buffer it will leave you with a new blank buffer.

Throw this in your .vimrc:

map <leader>q :bp<bar>sp<bar>bn<bar>bd<CR>

Restart Vim, or just :source ~/.vimrc for changes to take effect. Next time you want to close a buffer just type: \q (if \ is your leader key)


I searched for this today and came up with

:b#|bd#

which changes the current window to the previously open buffer and deletes/hides the buffer you just switched away from.

This requires at least two known buffers.

If another window but the current shows the same buffer this will still destroy splitting. You can change all windows to the previously open buffer with

:windo b#

I added more detail about the former command discussing a mapping for it (and some pitfalls) in an answer to a similar question.


There's a script on the Vim wiki to do this. I don't think there is a builtin that does what you want.

The latest version of vim-bufkill is on github.


nmap <leader>d :bprevious<CR>:bdelete #<CR>

Works as it should until one buffer is open in several windows. Good enough unless you want to use the bigger scripts out there.

Edit: this is what i use right now:

function! BufferDelete()
    if &modified
        echohl ErrorMsg
        echomsg "No write since last change. Not closing buffer."
        echohl NONE
    else
        let s:total_nr_buffers = len(filter(range(1, bufnr('$')), 'buflisted(v:val)'))

        if s:total_nr_buffers == 1
            bdelete
            echo "Buffer deleted. Created new buffer."
        else
            bprevious
            bdelete #
            echo "Buffer deleted."
        endif
    endif
endfunction