I am using coc-pywright to jump to the definition for programming in python. I have set it up to open a vertically split window. Sometimes I just want to keep current buffer in order to fully spread it on the screen.
What I want?
A command or a shortcut to close all the buffers except current buffer. For example:
:BufferOnly " o is short for only. <leader>+o
Reference from google
Basically there are two ways:
- Close all buffers and use
edit #to reopen current buffer
- Use a plugin which defines command and search for the specific buffer
The first solution will cause the screen to flush and if not configured correctly we will lose the editing position we previously working on.
nnoremap <leader>o :%bd\|e#<CR> nnoremap <leader>o :execute '%bdelete\|edit #\|normal `"'\|bdelete#<CR>
The first command will close all buffers and reopen current buffer, but it will lose the editing position. The second command will close all the buffers, reopen current buffer and return to previous editing position. But it wlll cause the screen to flush and lose the cursor position (Not visible until we move the position)
Make my hand dirty
Try my best to learn the basic language of
vimscript from following websites:
I come out with my own solution
function! CloseOtherBuffer() let l:bufnr = bufnr() execute "only" for buffer in getbufinfo() if !buffer.listed continue endif if buffer.bufnr == l:bufnr continue else if buffer.changed echo buffer.name . " has changed, save first" continue endif let l:cmd = "bdelete " . buffer.bufnr execute l:cmd endif endfor endfunction nnoremap <leader>o :call CloseOtherBuffer()<CR>
I have defined leader to
, previously using
The idea is simple:
- Find my buffer number
- Iterate all listed buffers and close those whose buffer number are not equal to my buffer number.
After carefully reading the code of
BufOnly.vim, I found out
that the idea and implementations are similar.
:help getbufinfo :help bufnr
bdelete buffer.bufnrnot working. Vimscript does not replace variable with its value
" Works let l:cmd = "bdelete " . buffer.bufnr execute l:cmd " Not working, buffer.bufnr not replaced with the actual number bdelete buffer.bufnr
filterwith buffer property
listed, otherwise there will be other buffers which are not edited appearng.