是否可以在 Vim 中显示缩进指南?

Posted

技术标签:

【中文标题】是否可以在 Vim 中显示缩进指南?【英文标题】:Is it possible to display indentation guides in Vim? 【发布时间】:2011-01-10 15:02:43 【问题描述】:

我是一个长期使用 Vim 的用户(3 或 4 年),最近开始处理一些深度嵌套的代码。此代码使用空格而不是制表符缩进。我想要一些清晰且不分散注意力的缩进指示,以帮助跟踪我在查看多个层次的内容时所在的代码块。

:set list 

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

有人知道如何实现吗?

【问题讨论】:

看看github.com/nathanaelkane/vim-indent-guides 【参考方案1】:

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

: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,其中 实现了上述方法的略微扩展版本。

【讨论】:

这很好用,但是否可以每 4 个空格显示更多的 Sublime Text 样式垂直线? @seagoj:不幸的是,即使在 GVim 中也无法绘制实际的图形线。最接近的近似值是在每个 shiftwidth 位置突出显示空格列,这正是此处提出的解决方案所做的。 @nikolay-fransev 的解决方案基本上就是我想要的。 这很酷,但我很想知道如何将缩进列中的 _ 更改为其他字符。 @Mnebuerquo:您可以通过在上面的matchadd() 调用中使用专用的突出显示组,或者将CursorLine 组保留在那里并使用@ 自定义其外观来完全自定义它。 987654332@ 命令。见:help :highlight:help highlight-groups【参考方案2】:

这个答案有点晚了,也是一个无耻的插件。 :)

不管怎样,试试我的Indent-Guides.vim 插件。它的创建是为了解决我对 vim 中缺少缩进指南的烦恼。我受够了等待其他人来建造它,所以我自己做了。

特点:

可以检测制表符和空格缩进样式。 自动检查您的配色方案并选择合适的颜色(仅限 gVim)。 将使用交替颜色突出显示缩进级别。 完全支持 gVim,基本支持 Terminal Vim。 似乎可以在 Windows gVim 7.3 上运行(但尚未进行任何广泛的测试)。 缩进指南的可自定义大小,例如。瘦指南(仅限软标签)。 可自定义的起始缩进级别。

以下是该插件的一些截图:put your mouse here and click。

【讨论】:

有没有人让它在非 Windows 机器上工作?无论是否通过 Pathogen,无论是 vim 还是 gvim,我都无法加载它。甚至没有加载帮助文件 @puk:使用 MacVim (Vim 7.3) 和 Pathogen 对我来说效果很好。 你碰巧还在做这个吗?就个人而言,我喜欢 Notepad++ 的缩进指南,我希望 gVim 也能做到这一点…… 我必须将 let g:indent_guides_enable_on_vim_startup=1 添加到我的 .vimrc 中才能启用它。 (我无法加载帮助文件,但添加此行后插件工作正常。 很棒的插件,但唯一的问题是当我尝试使用鼠标从终端复制文本时,也会复制缩进字符(|)。【参考方案3】:

以下命令将配置 Vim 以显示点来表示 键入时的缩进级别。当这些点神奇地消失时 光标离开行:

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

【讨论】:

它在 MacVim 版本 8.0.502 (129) 上对我不起作用,它们不会像离开行一样消失。 有什么方法可以让制表符和空格一样消失?【参考方案4】:

您可以使用制表符来显示缩进指南并在保存文件之前删除制表符:

" 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

【讨论】:

来自 Nikolay 的回答 >" display indentation guides >set list listchars=tab:❘-,trail:·,extends:»,precedes:«,nbsp:× 在 XP 上使用 gVim 我不得不转义我的 vimrc 中的管道字符,如 >tab:\|- 否则我得到 E474: Invalid argument: lcs=tab:【参考方案5】:

如果您使用空格缩进代码,您可以尝试 my 插件:https://github.com/Yggdroot/indentLine,它显示细垂直线但不显示上述答案提到的粗垂直线。如果您使用制表符缩进代码,只需:set list lcs=tab:\|\ (here is a space)

【讨论】:

您需要披露这是您的项目。而您的最后一个答案只是一个链接,因此毫无用处。 @ThiefMaster 谁在乎他不透露这是他的项目?这是一个有效的答案。有可能有缩进quides(使用他的插件),但它是免费和开源的......所以谁在乎他是否不透露它是他的?他提供了一个解决方案。 @ThiefMaster 如果他只是将他的代码直接粘贴在 inside 答案中,你会更喜欢它吗? @trusktr:因为 Stack Overflow 社区的大多数人都不喜欢未公开的自我推销和仅包含链接的答案!如果您对此有任何疑问,请在Meta Stack Overflow 上发帖。 @ThiefMaster 有关于“多数”声明的参考资料吗?【参考方案6】:

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

【讨论】:

【参考方案7】:

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

编辑:您使用什么语言?此插件适用于 C 风格的语言。

【讨论】:

我最需要的两种语言是 Perl 和 Xml。我之前遇到过那个插件,并且正在寻找外观比块突出显示更干净的东西 - 比如细垂直线。

以上是关于是否可以在 Vim 中显示缩进指南?的主要内容,如果未能解决你的问题,请参考以下文章

VIM实用指南(12)VIM如何批量缩进

VIM实用指南(12)VIM如何批量缩进

Vi||Vim显示行号,自动缩进,调整tab键宽度技巧

vim显示行号语法高亮自动缩进的设置

vim配置python高亮和缩进

vim选中多行缩进(python多行缩进)