19

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 ?

Giacomo1968
  • 53,069
  • 19
  • 162
  • 212
juanpablo
  • 6,966
  • 11
  • 52
  • 72

5 Answers5

21

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.

Gid
  • 411
  • 4
  • 5
  • 5
    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 00:08
  • Is it possible to get the number in the current tab instead? – Niing Jan 04 '22 at 08:28
12

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)'))
Luc Hermitte
  • 1,855
  • 11
  • 11
5

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.

Heptite
  • 19,383
  • 5
  • 58
  • 71
  • 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('$'))
Rook
  • 23,617
  • 32
  • 128
  • 213
  • 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 01: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 01: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 01: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 03: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 03: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)'))
Andrzej
  • 21
  • 1