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 を使っています。
まだ、あんまり使っていないのでもうちょっと改良する余地はあると思うけどだいたいはこれでいいかなぁ。
あと復元も出来るようにしたいところ。