是否可以在 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/
它突出显示 - 使用搜索突出显示组;任何其他组 当然,可以使用——第一个、第五个和第九个(它可以是 续)由前面的空格字符占用的虚拟列 从行首开始只有空格。因此,这 为最多为三个的四个空格缩进产生突出显示 层次深。
唯一能概括这个想法的是一个过程
根据
当前缓冲区的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
调用它。
例如,请参阅缩进指南突出显示配置
来自我的.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 中显示缩进指南?的主要内容,如果未能解决你的问题,请参考以下文章