Content #
Vim has a built-in command to close all windows except the current one (:only), which is nice for focusing on a single buffer. Sometimes I want to cleanup my buffers by closing all of the buffers except for the current one.
This can be done with the command:
:%bdelete|edit #|normal `"
How it Works #
By separating with a bar (|) we can put multiple commands on one line (see :help :bar). So our command is actually three separate commands run one after another.
%bdelete
edit #
normal `"
%bdelete #
The %bdelete command deletes (closes) all buffers.
Using bdelete (without the % prefix) deletes a buffer. (see :help bdelete)
The % represents from 1 up to the highest value. (see :help :%)
Since we can prefix a command with a range (e.g. :3,5bdelete will delete buffers 3 through 5), it is as if we are running :1,999bdelete except instead of 999 Vim automatically uses the largest buffer number.
edit #
The :edit {file} command opens a file for editing when that file is given as a parameter. (e.g. :edit ~/.vimrc will open my .vimrc file for editing). (see :help edit_f)
The # in this context represents the alternate filename (see :help _# and :help alternate-file). You can see the value of # with
:echo expand('#')
normal `” #
The normal command allows us to execute a normal mode command from the command line. (see :help :normal).
When we run `" in normal mode we jump to the cursor position where we last exited the current buffer. (see :help `")
Summary #
So when you run :%bdelete all buffers are deleted including the current buffer leaving you in a new empty buffer.
The alternate file is the last buffer you were viewing before they all closed so :edit # opens that file.
Then normal `" is the same as pressing `" in normal mode, which jumps us to our last cursor position in that buffer.
Mapping #
By adding the following to our .vimrc we can use :BufOnly to close all buffers except the current buffer.
command! BufOnly execute '%bdelete|edit #|normal `"'
From #
https://salferrarello.com/vim-close-all-buffers-except-the-current-one/