Vim Tips Wiki
Tip 303 Printable Monobook Previous Next

created 2002 · complexity basic · author TVIM · version 6.0

I use this function to let me know if my cursor is on a TAB column.

The t* on the ruler means I am not. But t3 means the cursor is on tablevel 3

~vimrc ----------------------- My Ruler ------------------------ r4,c13,t3

~vimrc ----------------------- My Ruler ------------------------ r4,c14,t*

If you want to change a tab level you can drag or push the first character of a line to a desired tab level (more on that later).

This ruler replacement will let you know where you are, whether you like to use space tabs (see VimTip12) or regular tabs. My function is set to four space tabs stops and only goes 9 levels but can be easily modified.

Actually I just wanted to learn how to use a function in my _vimrc and this was my first attempt. Add this to your _vimrc:

set laststatus=2
"This makes sure the ruler shows. See help laststatus
set statusline=%f\ ---------\ My\ Ruler\ ----------\ r%l,c%c,t%{ShowTab()}
"See help statusline (I toggle between 12 helpful rulers -- more on that later)
fu ShowTab()
  let TabLev='*'
  let Col=(col("."))
  if Col == 1 | let TabLev='0' | en
  if Col == 5 | let TabLev='1' | en
  if Col == 9 | let TabLev='2' | en
  if Col ==13 | let TabLev='3' | en
  if Col ==17 | let TabLev='4' | en
  if Col ==21 | let TabLev='5' | en
  if Col ==25 | let TabLev='6' | en
  if Col ==29 | let TabLev='7' | en
  if Col ==33 | let TabLev='8' | en
  if Col ==37 | let TabLev='9' | en
  return TabLev
"The ruler (statusline) shows a t* unless you are on col 1,5,9,13,...

This function ShowTab() gets called and updates the ruler with every cursor move but it does not slow things down as I type. Perhaps a speed typist may complain.


Looks like the tab level is basically set to ( col( '.' ) - 1 ) / 4. The 4 is probably the value of &ts instead. Of course, this always returns a value even if you're in the middle of a tab (not actually ON a tabstop), so something like this:

let TabLevel = ( col( '.' ) - 1 ) / &ts
if ( ( TabLevel * &ts + 1 ) != col( '.' ) )
 let TabLevel = '*'

Works for all levels of tabs. The proof and verification thereof is left to the reader as an exercise.

The 2nd example didn't work for me, so

fu ShowTab()
  let TabLevel = (indent('.') / &ts )
  if TabLevel == 0
    let TabLevel='*'
  return TabLevel