vim:总缓冲区数


12

在vim中

:buffers

我得到的所有缓冲区的数量与

:ls

但是,
如何获取缓冲区的总数?

Answers:



14

到目前为止的答案都太客气了。这是vim的内置方式:

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

与往常一样,请参见vim的帮助(:h getbufinfo())以获取官方说明。


3
在被问到这个问题时,您的答案将是不可能的,因为Vim不支持它。现在,它可能是最佳解决方案。
庚岩7年

4

据我所知,Vim中没有内置方法可以执行此操作,但是您可以创建一个函数:

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

将上面的内容放入一个以.vim结尾的文本文件中:source,然后可以执行以下操作:

:let buffer_count = NrBufs()
:echo buffer_count

6月21日注意:如果您有截至2017年的Vim最新版本,则Gid的以下回答是最佳解决方案。


1
注意别人谁找到这样的:我觉得应该是',而我> 0,因为缓冲从1开始,不是0

@Meta:我已确定答案。谢谢。尽管这实际上不是问题,因为将始终至少有一个缓冲区。
Heptite

3

您是否在寻找?

:echo(bufnr('$'))

由于Vim从不回收缓冲区号,因此它将“计数”已卸载的缓冲区,加上它必须是:echo bufnr('$')
Heptite 2011年

(好吧,您的版本将正确地呼应上次加载的缓冲区的编号,但语法有些混乱。)
Heptite 2011年

@Heptite-是的,那是一个错误。至于语法问题,我认为两者之间没有区别。
Rook:

它们执行相同的操作,但是:echo是命令而不是函数,并且永远不能像函数一样使用(除非您将用户定义的函数包装在:echo周围)。在VimL的许多情况下,差异是重要的。
Heptite

@Heptite-我必须承认我不知道你刚才说的是什么...(这里更多的是胶带工程师;更少的“代码是美丽的”程序员)
Rook

2

如果要使用Heptite解决方案作为命令,请将以下内容添加到您的.vimrc文件中:

command BufNum echo len(filter(range(1, bufnr('$')), 'buflisted(v:val)'))
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.