Vim buffers: status(line) symbol

If you use the Vim editor, sooner or later you run into the concept of text buffers.

I wanted a way to report on Vim statusline that I have more than one modifiable buffer opened, this is particularly useful when Vim is invoked by some other program (in my case it was git send-email --compose --annotate')

Inspired from the crazy statuslines from Got Ravings? I tried a first approach:

set statusline+=%#WarningMsg#%{bufnr('$')>1?'[buffers:'.bufnr('$').']':''}%#StatusLine#

This wasn't exactly what I wanted because bufnr('$') takes into account also deleted and unlisted buffers, so a very simple filtering function is needed:

function! NBuffers()
  let bufmax = bufnr("$")
  let nbuffers = 0
  let i = 1
  while i <= bufmax
    if buflisted(i) && getbufvar(i, "&modifiable")
      let nbuffers += 1
    endif
    let i += 1
  endwhile
  return nbuffers
endfunction

set statusline+=%#WarningMsg#%{NBuffers()>1?'[buffers:'.NBuffers().']':''}%#StatusLine#

While at it I also added a very handy map to switch between buffers, taken from this discussion:

:map __ :ls<CR>:b 

This shows the buffer list and leave the :buffer command open so you can use wildmenu to select the one you want to switch to.

Just for your reference, this is the full statusline I am using right now:

" Status line setting
set statusline=
set statusline+=[%n]			      " buffer number.
set statusline+=[File:%f]		      " filepath (relative).
set statusline+=[%{strlen(&ft)?&ft:'none'},   " filetype
set statusline+=%{strlen(&fenc)?&fenc:&enc},  " encoding
set statusline+=%{&fileformat}]		      " file format
set statusline+=%h%m%r%w		      " flags
set statusline+=%=			      " separator

function! NBuffers()
  let bufmax = bufnr("$")
  let nbuffers = 0
  let i = 1
  while i <= bufmax
    if buflisted(i) && getbufvar(i, "&modifiable")
      let nbuffers += 1
    endif
    let i += 1
  endwhile
  return nbuffers
endfunction

" highlight if there is more than one buffer opened
"set statusline+=%#WarningMsg#%{bufnr('$')>1?'[buffers:'.bufnr('$').']':''}%#StatusLine#
set statusline+=%#WarningMsg#%{NBuffers()>1?'[buffers:'.NBuffers().']':''}%#StatusLine#
set statusline+=[Row:%l]		      " row
set statusline+=[Col:%v]		      " column
set statusline+=[%3p%%]			      " percentage
set laststatus=2

Have fun with VIM, if you are an heretic too.


CommentsSyndicate content

Post new comment

The content of this field is kept private and will not be shown publicly. If you have a Gravatar account associated with the e-mail address you provide, it will be used to display your avatar.
  • Web page addresses and e-mail addresses turn into links automatically.
  • Allowed HTML tags: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd>
  • Lines and paragraphs break automatically.

More information about formatting options

CAPTCHA
This question is for testing whether you are a human visitor and to prevent automated spam submissions.
9
8
5
i
4
D
Enter the code without spaces.