I\'m a longtime Vim user (3 or 4 years) who has recently started dealing with some deeply nested code. This code is indented with spaces, not tabs. I would like some clean
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.