Probably the most effective solution would be to “draw” indentation
guides using match-highlighting. To understand how it may be useful,
take a look at the following example:
:match Search /\%(\_^\s*\)\@<=\%(\%1v\|\%5v\|\%9v\)\s/
It highlights—using the Search highlighting group; any other group
can, of course, be used—the first, the fifth, and the ninth (it can be
continued) virtual columns occupied by the space character preceding
nothing but whitespace from the beginning of line. Hence, this
produces highlighting for four-space indentation that is at most three
levels deep.
The only thing remaining to generalize this idea is a procedure
generating a pattern similar to the one above, according to the
current buffer’s textwidth
and shiftwidth
settings, in order
to handle deeper indent levels and use the actual indentation width.
This task can be simply automated as shown in the function below.
function! ToggleIndentGuides()
if exists('b:indent_guides')
call matchdelete(b:indent_guides)
unlet b:indent_guides
else
let pos = range(1, &l:textwidth, &l:shiftwidth)
call map(pos, '"\\%" . v:val . "v"')
let pat = '\%(\_^\s*\)\@<=\%(' . join(pos, '\|') . '\)\s'
let b:indent_guides = matchadd('CursorLine', pat)
endif
endfunction
Whenever indentation guides are necessary in the current buffer, it
can be switched on via :call ToggleIndentGuides()
. Of course, one
can change the highlighting group (or even create a dedicated one for
using with indentation guides), setup a handy mapping for that, and
call it from an autocmd
for some file types.
For an example, see the indentation guides highlighting configuration
from my .vimrc
file at https://gist.github.com/734422, which
implements a slightly extended version of the above approach.