In my vimscript, I need to get a count of all buffers that are considered listed/listable (i.e. all buffers that do not have the unlisted, 'u', attribute).
What's the recommended way of deriving this value?
In my vimscript, I need to get a count of all buffers that are considered listed/listable (i.e. all buffers that do not have the unlisted, 'u', attribute).
What's the recommended way of deriving this value?
You could use bufnr()
to get the number of the last buffer, then create a
list from 1 to that number and filter it removing the unlisted buffers, by
using the buflisted()
function as the test expression.
" All 'possible' buffers that may exist
let b_all = range(1, bufnr('$'))
" Unlisted ones
let b_unl = filter(b_all, 'buflisted(v:val)')
" Number of unlisted ones
let b_num = len(b_unl)
" Or... All at once
let b_num = len(filter(range(1, bufnr('$')), 'buflisted(v:val)'))
I would do it by calling buflisted()
on the range of numbers up to the largest buffer number given by bufnr("$")
. Something like this:
function! CountListedBuffers()
let num_bufs = 0
let idx = 1
while idx <= bufnr("$")
if buflisted(idx)
let num_bufs += 1
endif
let idx += 1
endwhile
return num_bufs
endfunction
A simple solution is using getbufinfo
.
In your vimscript:
len(getbufinfo({'buflisted':1}))
or test it with command:
:echo len(getbufinfo({'buflisted':1}))