Vim で開いているウィンドウをスキップしながらバッファを切り替える

バッファを切り替える際に、すでにウィンドウが開いているならば、スキップして切り替えるとかそんな感じ。
複数ウィンドウを開いている状態で、:bnext で切り替えると、すでに開いているウィンドウも切り替えるのでちょっと無駄かなーと。
Quickfix とか、切り替えなくていいんですよ!

[コード]

" バッファへ移動処理
function! s:rotate(list, middle)
    let l:index = index(a:list, a:middle)
    if l:index <= 0
        return a:list
    endif
    
    let l:result = []
    for value in a:list
        call add(l:result, a:list[l:index])
        let l:index = (l:index + 1) % len(a:list)
    endfor
    return l:result
endfunction

function! s:buffer_number_list()
    let l:i = 1
    let l:result = []
    while (l:i <= bufnr("$"))
        if buflisted(l:i)
            call add(l:result, l:i)
        endif
        let l:i += 1
    endwhile
    return l:result
endfunction

function! s:next_buffer()
    for num in s:rotate(s:buffer_number_list(), bufnr("%"))[1:-1]
        if bufwinnr(num) == -1
            return num
        endif
    endfor
    return -1
endfunction

function! s:prev_buffer()
    for num in s:rotate(reverse(s:buffer_number_list()), bufnr("%"))[1:-1]
        if bufwinnr(num) == -1
            return num
        endif
    endfor
    return -1
endfunction

" コマンドの設定
command!
    \ -nargs=* NextBuffer
    \ let num = s:next_buffer()|
    \ if num >= 0 | execute ':buffer '.num | endif
nnoremap <silent> <C-l> :NextBuffer<CR>

command!
    \ -nargs=* PrevBuffer
    \ let num = s:prev_buffer()|
    \ if num >= 0 | execute ':buffer '.num | endif
nnoremap <silent> <C-h> :PrevBuffer<CR>


こんな感じかな?
まぁこれもバッファの数が多いなら、unite-buffer とかを使ったほうがいいですね。


あと s:rotate や s:buffer_number_list なんかは、 Utility Library としてまとめておいてもいいかも知れない。
リストの操作はもうちょっと欲しいですね。
Vim Script に慣れてきてるといいなー。