Maneira simples de fechar qualquer coisa

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:

  1. Estou pressionando um acorde fundamental
  2. Se houver mais de um buffer no Vim – feche o buffer atual, mas saia da janela
  3. Caso contrário, se o buffer estiver vazio – saia do Vim
  4. Caso contrário, se o buffer for aberto em várias janelas – feche a janela
  5. 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 é