24

I usually open a few windows and keep some buffers open. Since my MO in buffer exploring is to use quick shortcuts to :bn and :bp, I want to close unneeded buffers from distracting my buffer surfing.

But the pain is, issuing :bd and :bw results in closing the window as well, in case I have multiple ones open. How do I close (delete) a buffer and leave the windows intact?

Solution inspired by @peth's answer

:command! BW :bn|:bd#

It is simple. Doesn't work well with only one buffer open (I get different behaviour depending on the way I open the files) but it isn't a big issue. :)

13

It can be a pain, this question is raised over and over on #vim (Freenode), too.

Some people recommend not deleting buffers and switching with :b partial<Tab> instead of :bn, which works, but isn't what you're asking.

The best way I know of to do that is to switch to another buffer and then :bd#, which you could map, of course.

See also Deleting a buffer without closing the window on the Vim wikia.

| improve this answer | |
  • The script looks a solution I'm willing to accept if there is not official way. :) – nperson325681 May 27 '11 at 12:56
22

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>

Or a command for your .vimrc (call with :Bd):

command Bd bp | sp | bn | bd

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.

| improve this answer | |
  • 3
    I lose my split if I close a buffer open in both windows, such as the last buffer. +1 for being simpler than the wikia scripts to bd without closing the window. – Leif Carlsen Feb 3 '13 at 19:35
  • I was using vim-bbye but your answer is much more simpler and does not depend on any script. Thank you. – Andrew-Dufresne Feb 3 '17 at 21:23
4

A window is a viewport into a buffer. (See :help window.) You can't have a window without an associated buffer. You can use a command such as :enew to replace the current window contents with an empty buffer, though.

| improve this answer | |
  • 1
    I was expecting that after a buffer delete, vim could switch to another buffer, or open a new one if necessary. – nperson325681 May 27 '11 at 7:06
  • @progo, that would require some scripting, i.e. plugin, or a simple mapping. – Clint Pachl Sep 1 '11 at 6:51
2

the bufkill.vim plugin works as well. I like to use it with vim-command-w for added functionality and niceties (like it will close a split if it's the last buffer or close vim if it's the last buffer/split).

| improve this answer | |
1

Here's another solution:

map <C-W>o <C-W>n<C-W><C-W><C-W>c

Typing Ctrl+W then o will quietly create a new window and close the old window. The cursor is left in the new window. There are a number of positive effects:

  1. Your original split dimensions are preserved.
  2. An empty buffer is loaded in the new split.
  3. The original buffer is still loaded, use :buffers to list it.
  4. Ctrl+o moves the cursor to its original position in the old buffer should you need to go back.
  5. Works well even if only one window loaded.
| improve this answer | |
1

I think the problem is that most people expect vim buffer and window to be something they aren't.

People tend to think of a vim window as a standalone process that has its own list of buffers, but sadly it isn't. A vim window is only a viewport of its buffers.
Therefore a lot of problems arise, like your problem, or the problem that different window share the same buffer list so you can't edit Buffer 1 in Window A, and let Window B ignore Buffer 1 in its buffer list.

My solution is to open two instances of vim, so that you can have the kind of vim window you want. It works best on tiling WMs.

| improve this answer | |
1

Usually I just open the menu while on any buffer. This will open the menu on the left pane and cursor will be active there. So I just switch back to the active buffer and delete the buffer.

After that I can open other file from the menu.

My Steps is:

:Vex

ctrl + w + w

:bd
| improve this answer | |

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.