物置き

ウインドウを閉じずにバッファを閉じる

"I" novel? : ウインドウを閉じずにバッファを閉じる


:bdeleteでカレントバッファを削除したとき、ウインドウまで閉じられてしまうのはなんとかならんかと思ってぐぐったら、
上記のエントリでまさに欲しかった関数を発見し、
以来ずっとこれを使っているのだけど、この関数にはちょっとだけおかしな点があった。


1. 未保存のバッファを!修飾子を指定せずに閉じようとした場合はエラーになるわけだけど、バッファが複数ある場合に、エラーメッセージが表示された後、カレントバッファが変わってしまう
2. バッファもウインドウも一つしかない状況で、バッファを閉じるのに失敗した場合になぜかウインドウ(と無名バッファ)が作成されてしまう


2.は実用上ほとんど問題ないけど、1.は使っていると結構遭遇する機会が多い。
今まで使ってきて、漠然としたひっかかりを感じながらもそのまま使ってきたのだけど、
これは改善すべき点であるということに気がついたので、
上の現象が起こらないように修正してみた。

" ウィンドウを閉じずにバッファを閉じる

function! s:BufcloseCloseIt(bang)
  let l:currentBufNum = bufnr("%")
  let l:alternateBufNum = bufnr("#")

  if buflisted(l:alternateBufNum)
    buffer #
  else
    bnext
  endif

  if bufnr("%") == l:currentBufNum
    " bangが空でバッファが変更されている場合bwipeoutは失敗するのでnewは不要
    if a:bang == '!' || &mod==0
      new
    endif
  endif

  if buflisted(l:currentBufNum)
    execute "silent bwipeout".a:bang." ".l:currentBufNum
    " bwipeoutに失敗した場合はウインドウ上のバッファを復元
    if bufloaded(l:currentBufNum) != 0
      execute "buffer " . l:currentBufNum
    endif
  endif
endfunction

これで上記の現象は起こらなくなった。満足。

追記

kwbd.vim : ウィンドウレイアウトを崩さないでバッファを閉じる - 名無しのVim使い

同じ機能を実現するスクリプト(若干挙動は異なる)だけど、リンク先のは一行で実現していてとってもエレガント!ウホッ!