vim: número de buffers totais

12

em vim, com

:buffers

Eu recebo o número de todos os buffers da mesma forma

:ls

, mas
como posso obter o número total de buffers?

Juan Pablo
fonte

Respostas:

14

As respostas até agora são muito hacky. Aqui está a maneira integrada do vim:

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

Como sempre, consulte a ajuda do vim ( :h getbufinfo()) para obter a explicação oficial.

Gid
fonte
3
No momento em que isso foi solicitado, sua resposta não seria possível porque o Vim não a apoiava. Agora é provavelmente a solução ideal.
Heptite
4

Que eu saiba, não há método interno no Vim para fazer isso, mas você pode criar uma função:

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

Coloque o texto acima em um arquivo de texto com o nome terminado em .vim,: source, e você pode fazer algo como:

:let buffer_count = NrBufs()
:echo buffer_count

Nota de 21 de junho: Se você possui uma versão recente do Vim a partir de 2017, a resposta de Gid abaixo é a solução ideal.

Heptite
fonte
11
Nota para os outros que encontrar o seguinte: eu acho que deveria ser 'enquanto i> 0', uma vez que os números de buffer começar a partir de 1, não 0.
Meta
@Meta: Eu consertei minha resposta. Obrigado. Embora não seja realmente um problema, pois sempre haverá pelo menos um buffer.
Heptite 11/07/2013
3

Você está procurando talvez?

:echo(bufnr('$'))
Torre
fonte
Isso "contará" os buffers que foram descarregados, pois o Vim nunca recicla um número de buffer, além de ter que ser: echo bufnr ('$')
Heptite
(Ok, sua versão ecoará corretamente o número do último tampão carregado, mas a sintaxe é um pouco confuso.)
Heptite
@ Heptite - Sim, isso foi um erro. Quanto à questão da sintaxe, não vejo diferença entre os dois.
Rook
Eles fazem o mesmo, mas: echo é um comando e não uma função, e nunca pode ser usado como uma função (a menos que você envolva sua própria função definida pelo usuário em torno de um: echo). A diferença é importante em muitos contextos do VimL.
Heptite 12/10/11
@Heptite - Devo admitir que eu não tenho nenhuma idéia do que você acabou de dizer ... (mais de um engenheiro de fita adesiva aqui, menos de um "código é bonito" programador)
Rook
2

Se você deseja a solução do Heptite como um comando, adicione o seguinte ao seu arquivo .vimrc:

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