Hatena::Groupvim

バッファリストの取得

バッファリストの取得

:buffers! の結果を redir で取得する

function! GetBuffers1()
  redir => bufs | silent buffers! | redir END
  return map(split(bufs, "\n"), 'matchlist(v:val, ''^\s*\(\d*\)\([^"]*\)"\([^"]*\)".*$'')[1:3]')
endfunction
[0]
バッファ番号
[1]
インジケータ
[2]
パス

インジケータに含まれる文字を調べることでバッファの状態を知ることができる。*1

実行例:
[
  ['1', ' %a + ', 't.vim'],
  ['2', 'u     ', '[Fuzzyfinder]'],
  ['3', ' #h   ', 'vim-fuzzyfinder/plugin/fuzzyfinder.vim'],
  ['4', '  a   ', 'vim-autocomplpop/plugin/autocomplpop.vim']
]

バッファが存在しうるバッファ番号をbufexists()でテストする

function! GetBuffers2()
  return map(filter(range(1, bufnr('$')), 'bufexists(v:val)'), 'v:val . ":" . bufname(v:val)')
endfunction
実行例:
[
  '1:t.vim',
  '2:[Fuzzyfinder]',
  '3:vim-fuzzyfinder/plugin/fuzzyfinder.vim',
  '4:vim-autocomplpop/plugin/autocomplpop.vim'
]

バッファが存在しうるバッファ番号をbuflisted()でテストする

function! GetBuffers3()
  return map(filter(range(1, bufnr('$')), 'buflisted(v:val)'), 'v:val . ":" . bufname(v:val)')
endfunction

bufexists()と違い、ヘルプバッファやスクラッチバッファなど'nobuflisted'なバッファは除外される。

実行例:
[
  '1:t.vim',
  '3:vim-fuzzyfinder/plugin/fuzzyfinder.vim',
  '4:vim-autocomplpop/plugin/autocomplpop.vim'
]

*1::help :buffers