可能最有效的解决方案是使用匹配突出显示“绘制”缩进指南。要了解它的用途,请查看以下示例:
:match Search /\%(\_^\s*\)\@<=\%(\%1v\|\%5v\|\%9v\)\s/
它突出显示——使用搜索突出显示组;当然,可以使用任何其他组 - 第一、第五和第九(可以继续)虚拟列被空格字符占据,该空格字符从行首开始只是空格。因此,这会为最多三层深度的四空间缩进产生突出显示。
唯一要推广这个想法的是一个过程,根据当前缓冲区textwidth
和shiftwidth
设置生成类似于上述模式的模式,以便处理更深的缩进级别并使用实际的缩进宽度。该任务可以简单地自动化,如下面的函数所示。
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
每当当前缓冲区中需要缩进指南时,可以通过:call ToggleIndentGuides()
. 当然,您可以更改突出显示组(甚至创建一个专用于缩进指南的组),为此设置一个方便的映射,并从autocmd
某些文件类型中调用它。
例如,请参阅我在https://gist.github.com/734422.vimrc
的文件中突出显示配置的缩进指南,它实现了上述方法的略微扩展版本。