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 に慣れてきてるといいなー。