8

in vim, with

:buffers

I get the number of all buffers the same with

:ls

, but
how I can get the total number of buffers ?

8

Same idea than Heptite's solution, but as a one liner. Many other things may be done this way: get the name of the buffer (thanks to map), wipeout buffers that match a pattern, https://stackoverflow.com/questions/2974192/how-can-i-pare-down-vims-buffer-list-to-only-include-active-buffers/2974600#2974600n etc.

echo len(filter(range(1, bufnr('$')), 'buflisted(v:val)'))
9

Answers so far are too hacky. Here is vim's built-in way:

len(getbufinfo({'buflisted':1}))

As always, see vim's help (:h getbufinfo()) for the official explanation.

  • 3
    At the time this was asked, your answer would not have been possible because Vim didn't support it. Now it's probably the optimal solution. – Heptite Jun 22 '17 at 0:08
4

To my knowledge there is no built-in method in Vim to do this, but you could create a function:

function! NrBufs()
    let i = bufnr('$')
    let j = 0
    while i >= 1
        if buflisted(i)
            let j+=1
        endif
        let i-=1
    endwhile
    return j
endfunction

Put the above in a text file with its name ending in .vim, :source it, then you can do something like:

:let buffer_count = NrBufs()
:echo buffer_count

June 21 note: If you have a recent version of Vim as of 2017, Gid's answer below is the optimal solution.

  • 1
    Note for others who find this: I think it should be 'while i > 0', since buffer numbers start from 1, not 0. – Meta Jul 11 '13 at 14:10
  • @Meta: I fixed my answer. Thanks. Although it's not really going to be an issue since there will always be at least one buffer. – Heptite Jul 11 '13 at 17:44
3

Are you looking perhaps for ?

:echo(bufnr('$'))
  • This will "count" buffers that have been unloaded since Vim never recycles a buffer number, plus it would have to be :echo bufnr('$') – Heptite Oct 12 '11 at 1:00
  • (Okay, your version will properly echo the number of the last loaded buffer, but the syntax is a little confusing.) – Heptite Oct 12 '11 at 1:07
  • @Heptite - Yes, that was a mistake. As to the matter of syntax, I see no difference between the two. – Rook Oct 12 '11 at 1:28
  • They do the same thing, but :echo is a command and not a function, and can never be used like a function (unless you wrap your own user-defined function around an :echo). The difference is important in many contexts of VimL. – Heptite Oct 12 '11 at 3:41
  • @Heptite - I must admit I've no idea what you just said ... (more of a duct tape engineer here; less of a "code is beautiful" programmer) – Rook Oct 12 '11 at 3:55
2

If you want Heptite's solution as a command, add the following to your .vimrc file:

command BufNum echo len(filter(range(1, bufnr('$')), 'buflisted(v:val)'))

protected by JakeGould Jan 9 '16 at 18:38

Thank you for your interest in this question. Because it has attracted low-quality or spam answers that had to be removed, posting an answer now requires 10 reputation on this site (the association bonus does not count).

Would you like to answer one of these unanswered questions instead?

Not the answer you're looking for? Browse other questions tagged or ask your own question.