On Mon, Nov 13, 2006 at 05:54:01PM -0800, Eggum, DavidX S wrote:
> Okay, try this, Matt (it is, again, lightly tested). Granted, it
> [...]
>
> set rulerformat=%60(%=%{GetBufCount()}%)
> autocmd VimEnter,BufAdd,BufDelete * call UpdateBufCount()
>
> let s:prev_last = 0
> let s:prev_count = 0
>
> function! UpdateBufCount()
> let lst = range(1, bufnr('$'))
> call filter(lst, 'buflisted(v:val)')
> let s:prev_count = len(lst)
> endfunction
>
> function! GetBufCount()
> return s:prev_count
> endfunction
Ok. I think I've finally settled on the best solution.
Firstly, of these two functions:
function Try1()
let lst = range(1, bufnr('$'))
call filter(lst, 'buflisted(v:val)')
let g:zbuflistcount = len(lst)
endfunction
function Try2()
let cnt = 0
for nr in range(1, bufnr("$"))
if(buflisted(nr))
let cnt += 1
endif
endfor
let g:zbuflistcount = cnt
endfunction
Try1 is 3 times faster than Try2 (tested with hundreds of buffers;
called hundreds of times).
So I decided to go with Try1; however, I'm still uncomfortable with it
in the rulerformat; so the final scheme I chose is as follows:
set rulerformat=%22(%{g:zbuflistcount};%M%n\ %=%l,%c%V\ %P%)
autocmd BufAdd * let g:zbuflistcount += 1
autocmd BufDelete * let g:zbuflistcount -= 1
autocmd VimEnter * call UpdateZBufLC()
function UpdateZBufLC()
let lst = range(1, bufnr('$'))
call filter(lst, 'buflisted(v:val)')
let g:zbuflistcount = len(lst)
endfunction
In addition to the above code, I had to add "nested" to several autocmds
that were preventing the "BufAdd" from firing.
I've been running with this scheme for a bit and it seems pretty stable.
Thanks a lot for everyone's help.
--Matt