2010-01-28 95 views
42

我是一个长期的Vim用户(3或4年),他最近开始处理一些深度嵌套的代码。此代码使用空格缩进,而不是制表符。我想要一些干净而不干扰的缩进指示,以帮助跟踪我在查看多层次深度内的代码块时的情况。是否可以在Vim中显示缩进指南?

:set list 

只显示制表符和结束符。我发现了一个插件(目前似乎无法挖掘它),它会以逐渐变暗的颜色突出显示每个缩进级别,但这在视觉上并不吸引人。理想情况下,我希望在每个缩进级别看到细的垂直线条。许多新编的编辑器都具有这种功能,但我不愿意放弃Vim。

有没有人知道这是如何实现的?

+0

看看https://github.com/nathanaelkane/vim-indent-guides – 2014-02-27 16:47:00

回答

1

试用此VIM插件BlockHL 它以不同方式对每个连续级别的缩进进行颜色编码。

编辑:你使用什么lanaguge?这个插件适用于C风格的语言。

+1

我最需要的两种语言是Perl和Xml。 我曾经遇到过这个插件,并且正在寻找一些比块高亮更简洁的东西 - 比如细的垂直线条。 – mjn12 2010-01-28 22:17:39

25

你可以使用标签来显示缩进引导和保存文件前删除标签:

" use 4 spaces for tabs 
set tabstop=4 softtabstop=4 shiftwidth=4 

" display indentation guides 
set list listchars=tab:❘-,trail:·,extends:»,precedes:«,nbsp:× 

" convert spaces to tabs when reading file 
autocmd! bufreadpost * set noexpandtab | retab! 4 

" convert tabs to spaces before writing file 
autocmd! bufwritepre * set expandtab | retab! 4 

" convert spaces to tabs after writing file (to show guides again) 
autocmd! bufwritepost * set noexpandtab | retab! 4 
+0

来自Nikolay的回答>“显示缩进指南”> set list listchars = tab:|-,trail:·,extends:»,before:«,nbsp:×在XP上使用gVim我必须在我的vimrc中转义管道字符,如> tab:\ | - 否则我得到了E474:无效参数:lcs = tab: – 2010-08-05 06:04:59

+0

listchar = tab:| - 不能用于空格 – 2012-05-05 00:04:16

+0

这正是我一直在寻找的,谢谢! – seagoj 2014-02-28 21:48:50

15

这将显示圆点,表示你的缩进级别为你键入。当你离开这条线时,这些点奇迹般的消失。

set list listchars=tab:»-,trail:·,extends:»,precedes:« 

E.g:

def test(): 
....print('indentation level 1') 

很酷吧?

+0

这是真棒 – sunil 2013-03-08 11:58:43

+0

它不适用于MacVim 8.0.502(129)我,他们不会消失离线。 – 2017-03-29 19:23:56

15

可能最有效的解决方案是使用匹配突出显示“绘制”缩进指南 。要了解它如何帮助,看看下面这个例子:

:match Search /\%(\_^\s*\)\@<=\%(\%1v\|\%5v\|\%9v\)\s/ 

它突出(使用搜索高亮组,它可以使用任何 等,当然)的第一,第五,第九(它可以是继续) 虚拟列占用的空格符号前面没有任何内容,但是从 开始的行中有空格。所以,这产生四空间缩进,突出显示 三个层次的深度。

为了概括这个想法它仍然只是产生像根据以上提及的是 图案当前缓冲区的textwidthshiftwidth (处理更深缩进水平和适当的缩进宽度)。这个任务可能是 只是自动化,如下面的功能所示。

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为某些文件 类型调用它。


缩进引导从我.vimrc 文件突出配置:https://gist.github.com/734422

+0

这很好,但它可以显示更多的每4个空格的崇高文本风格垂直线? – seagoj 2014-02-28 21:39:51

+0

@seagoj:不幸的是,即使在GVim中也不可能绘制出实际的图形线条,最接近的是每个'shiftwidth'位置突出显示空格的列,这正是这里提出的解决方案确实。 – 2014-03-01 08:07:25

+0

@ nikolay-fransev的解决方案基本上是我正在寻找的。 – seagoj 2014-03-01 21:09:36

65

注意:这个答案是有点迟到了,也是一个无耻的插头:)

无论如何,尝试我的Indent-Guides.vim插件。它的创建是为了在vim中缺乏缩进指南而搔痒自己的痒痒。我厌倦了等待别人来建造它,所以我只是自己做了。

特点:

  • 可以检测标签和空间缩进风格。
  • 自动检查您的颜色配方并选择合适的颜色(仅限gVim)。
  • 将突出显示交替颜色的缩进级别。
  • 全面支持gVim和Terminal Vim的基本支持。
  • 似乎可以在Windows上运行gVim 7.3(尽管如此,还没有做过任何广泛的测试)。
  • 缩进指南的可自定义大小,例如。精简指南(仅适用于软标签)。
  • 可自定义的开始缩进级别。

下面是插件的几个截图:put your mouse here and click

+3

有没有人得到这个在非Windows的机器上工作?无论是否通过Pathogen,无论是vim还是gvim,我都无法加载它。即使帮助文件未被加载 – puk 2012-02-21 23:08:20

+1

@puk:使用MacVim(Vim 7.3)和Pathogen对我来说工作正常。 – 2012-02-29 14:40:57

+0

你碰巧还在为此工作?就个人而言,我喜欢Notepad ++的缩进指南,并且我希望看到gVim也这样做...... – polemon 2012-06-27 19:06:57

22

如果您用空格缩进代码,您可以尝试我的插件:https://github.com/Yggdroot/indentLine,它会显示细的垂直线条,但不会显示上面的回答中提到的粗垂直线条。如果你用标签缩进代码,只需要:set list lcs=tab:\|\ (here is a space)

+4

你需要透露它是你的项目。答案只是一个链接,因此很没用。 – ThiefMaster 2012-12-06 10:35:54

+0

添加突出显示活动块缩进指南!:D喜欢在Sublime Text和Notepad ++中。 – trusktr 2013-04-15 02:34:44

+7

@ThiefMaster谁在乎他是否没有透露它是他的项目?这是一个有效的答案。有可能有缩进问题(使用*他*插件),但它是免费的,开源的......所以谁在乎他是否不透露他的?他提供了一个解决方案。 – trusktr 2013-04-15 02:35:45

0

使用Indent-Guides.vim插件,并在需要时切换使用ig。有时候它可能会很烦人:)