O Vim tem várias maneiras de fechar buffers e janelas –
: bw,: bd,: bun,: q,: close e assim por diante. O que eu realmente queria era simplesmente fechar janelas e arquivos como em editores “comuns” (sublime, notepad ++, etc.), mas com o poder dos buffers do Vim. Meu algoritmo ideal para isso se parece com este:
- Estou pressionando um acorde fundamental
- Se houver mais de um buffer no Vim – feche o buffer atual, mas saia da janela
- Caso contrário, se o buffer estiver vazio – saia do Vim
- Caso contrário, se o buffer for aberto em várias janelas – feche a janela
- Este é um último buffer e há apenas uma janela – feche o buffer e deixe a janela vazia
O snippet de código para este fluxo é semelhante a este (requer o plug-in bufkill.vim)
function! CountListedBuffers()
let cnt = 0
for nr in range(1,bufnr("$"))
if buflisted(nr)
let cnt += 1
endif
endfor
return cnt
endfunction
function! SmartExit()
let s:BufferToKill = bufnr('%')
let s:EmptyBuffer = 0
if bufname('%') == '' && ! &modified && &modifiable
if &buftype == 'nofile' && &swapfile == 0
" Is scratch buffer, not empty
else
let s:EmptyBuffer = 1
endif
endif
" Get a list of all windows which have this buffer loaded
let s:WindowListWithBufferLoaded = []
let i = 1
let buf = winbufnr(i)
while buf != -1
if buf == s:BufferToKill
let s:WindowListWithBufferLoaded += [i]
endif
let i = i + 1
let buf = winbufnr(i)
endwhile
" Check that the buffer is last
if(CountListedBuffers() < 2)
let s:LastBuffer = 1
else
let s:LastBuffer = 0
endif
if s:LastBuffer
if len(s:WindowListWithBufferLoaded) > 1
execute "close"
else
if ! s:EmptyBuffer
execute "bw | bw"
else
execute "q"
endif
endif
else
let g_BufKillActionWhenBufferDisplayedInAnotherWindow="kill"
execute "BW"
let g_BufKillActionWhenBufferDisplayedInAnotherWindow="confirm"
endif
endfunction
nmap <Leader>q :call SmartExit() " Maps SmarExit function to Leader + q
PS Pode ser à primeira vista que este algoritmo não parece tão óbvio, mas você deveria experimentá-lo e dizer como é