0

Pursuing a vimscript function or expression that

count how many buffers been modified.

i.e., how many buffers :bm could switch to,

given that option hidden is set.

== Edit ==

In the hope of used in statusline.

1 Answer 1

2

Found it.

func! CountModifiedBuffer()
    let mod = map(getbufinfo(), 'v:val.changed')
    return len(filter(mod, 'v:val'))
endfunc

== Edit ==

I use %{IsBuffersModified()} instead of builtin %m inside my statusline setting, which encode more info.

" [+] if only current modified, [+3] if 3 modified including current buffer.
" [3] if 3 modified and current not, "" if none modified.
func! IsBuffersModified()
    let cnt = CountModifiedBuffer()
    return cnt == 0 ? "" : ( &modified ? "[+". (cnt>1?cnt:"") ."]" : "[".cnt."]" )
endfunc

== Edit Edit ==

CountModifiedBuffer could be one-liner.

    return len(filter(getbufinfo(), 'v:val.changed == 1'))
6
  • know getbufinfo from vi.stackexchange.com/a/10478/10254
    – qeatzy
    Commented Nov 23, 2017 at 8:04
  • 1
    NB: getbufinfo is deprecated. Use getbufvar instead. Example: getbufvar(0, "&mod") Commented Mar 30, 2018 at 23:46
  • 1
    @BradenBest, where have you read about getbufinfo() deprecation? Commented Jun 4, 2018 at 13:35
  • @LucHermitte This was over two months ago, so I don't remember the source. At the time, I was modifying a vim script that was using getbufinfo to render the buffers in the tab bar, and either through vim telling me directly, or a source online that said to use getbufvar, I found out that getbufinfo has been deprecated. I'm trying to test getbufinfo in vim right now and not only is it not working at all, but I can't find a single shred of documentation on it. :h getbufinfo -> nothing; :h getbufvar -> help page. So even if the source was wrong, getbufvar is clearly more reliable. Commented Jun 4, 2018 at 21:51
  • 1
    I'd check tomorrow on a fresh install of 8.1.02x or so. There is an entry behind :h getbufinfo(). If I remember correctly it's quite recent. Much more recent than getbufvar(). So indeed, getbufvar() is to be preferred for portability reasons. But not because the other one has been deprecated. According to git blame, getbufinfo() appears in v7.4.2204 and getbufvar() in v7.0c13. Commented Jun 4, 2018 at 23:15

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

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