Vim でウィンドウ内バッファタブ
バッファ移動・可視化するためにバッファごとにタブを生成しています。
しかし、これだとタブ内のウィンドウレイアウトを保持したままバッファ移動する事ができません。
例えば、上部にソースファイルウィンドウ、下部にエラーリストウィンドウを出力したまま、ソースファイルのみタブ移動すると下部のエラーリストウィンドウが付いてこない。
と、いう事でウィンドウで開いたバッファをタブ風に表示するスクリプトを書いてみました。
[ソース]
function! WindowBufferList() return get(w:, "bufferlist", []) endfunction function! AddWindowBuffer(nr) let w:bufferlist = WindowBufferList() + (index(WindowBufferList(), a:nr) == -1 ? [a:nr] : []) endfunction function! RemoveWindowBuffer(nr) call remove(w:bufferlist, index(w:bufferlist, a:nr)) endfunction function! s:bufname(bufnr, active) let label = bufname(a:bufnr) let label = fnamemodify(label,':p:h:t').'/'. fnamemodify(label,':t') let label = (a:active == a:bufnr ? "[" . label . "]" : label) if getbufvar(a:bufnr, "&modified") let label = '+ '.label endif return label endfunction function! WindowBufferTabLabel() let buffers = WindowBufferList() if len(buffers) == 1 return s:bufname(buffers[0], -1) else return join(map(copy(buffers), "s:bufname(v:val, bufnr('%'))"), " ") endif endfunction set guitablabel=%{WindowBufferTabLabel()} command! -nargs=0 NextWindowBuffer :execute ":buffer" WindowBufferList()[(index(WindowBufferList(), bufnr("%"))+1) % len(WindowBufferList())] command! -nargs=0 PrevWindowBuffer :execute ":buffer" WindowBufferList()[(index(WindowBufferList(), bufnr("%"))-1) % len(WindowBufferList())] command! -nargs=0 RemoveWindowBuffer :call RemoveWindowBuffer(bufnr("%")) | :bdelete nnoremap <silent> <A-l> :NextWindowBuffer<CR> nnoremap <silent> <A-h> :PrevWindowBuffer<CR> nnoremap <silent> <Space>bd :RemoveWindowBuffer<CR> augroup window_buffer autocmd! autocmd BufWinEnter * :call AddWindowBuffer(bufnr("%")) augroup END
とりあえず、見た目的にはこんな感じですね。
ウィンドウ内タブ移動はマッピングが思いつかなかったのでしょうが無く ALT を使っています。
まだ、あんまり使っていないのでもうちょっと改良する余地はあると思うけどだいたいはこれでいいかなぁ。
あと復元も出来るようにしたいところ。