在vim中折叠(展开和折叠)xml标签(xml解析)

25

我知道在vim中使用%可以在标签之间跳转,我也知道如何使用可视模式选择xml文件中标签之间的整个块,并使用o跳转到顶部和底部的标签。

我已经进行了多次网络搜索并安装了matchit插件,使用以下行在我的.vimrc文件中:

filetype plugin on
runtime macros/matchit.vim

我找到了这篇帖子,并尝试了closetag.vim。

我需要查看大型的XML文件,即使有多个显示器和眼镜,折叠文件中的某些部分也很有用。


是否有一种方法可以通过默认或插件在MacVim或vim中折叠和展开标签之间的部分?


我很好奇,你是如何使用 o 键在匹配的标签之间跳转的?这将非常有用,但在可视模式下按 o 不起作用! - Shahbaz
3个回答

28

缩进方法对我来说几乎有效,但我发现它的工作方式有点奇怪;基本上,它是根据标签内部内容而不是标签本身进行折叠的。这个对我很有用,来自Vim维基

let g:xml_syntax_folding=1
au FileType xml setlocal foldmethod=syntax

这种方法是基于实际标签的折叠,例如:

<MyLines group="first">
    <Foo value="1"/>
    <Foo value="2"/>
    <Foo value="3"/>
</MyLines>
<MyLines group="second">
    <Foo value="4"/>
    <Foo value="5"/>
    <Foo value="6"/>
</MyLines>

在第1行或第5行输入zc后,看起来会像这样:

+--  5 lines: <MyLines group="first">------------------------------------
<MyLines group="second">
    <Foo value="4"/>
    <Foo value="5"/>
    <Foo value="6"/>
</MyLines>

改为:

+-- 10 lines: <MyLines group="first">------------------------------------

3
这解决了我的问题,只需记得添加 syntax on - Paul
1
这是我最喜欢的答案,因为它只有最少量的命令。 - dctucker
可能需要再次编辑(:e)文件以使au命令生效。 - Terry Brown

20
你需要的功能叫做“折叠(folding)”。基本上,你可以告诉 Vim 使用它可用的某个 `foldmethod`,并使用像 `za`、`zr` 或 `zM` 这样的命令来管理每行的 `foldlevel`。你可以在 `:help folding` 中找到所有细节。
将这些行添加到你的 `vimrc` 中应该提供一个良好的起点:
augroup XML
    autocmd!
    autocmd FileType xml setlocal foldmethod=indent foldlevelstart=999 foldminlines=0
augroup END
使用这些设置,加载文件时所有折叠应该都是打开的,每行的折叠级别应该根据其缩进来确定,并且您应该能够将单个行折叠起来。
使用zm来折叠更多内容,使用zr来折叠更少内容,使用zc关闭折叠,使用zo打开它,使用za在这两种状态之间切换,使用zM关闭所有折叠,使用zR来打开它们等等...
文档:
:help folding
:help 'foldmethod'
:help 'foldlevelstart'
:help 'foldminlines'

@romainl,那么对于非预期的XML文件呢?只需使用ggG进行缩进,然后做相同的操作吗?或者有其他折叠选项可以实现这一点,而不依赖于缩进吗? - Nishant
1
在非缩进的XML中,您可以尝试使用syntax折叠方法或(我个人认为更好的)重新格式化并使用indent - romainl
1
根据我的经验,syntax 折叠方法在折叠时更能显示父标签而不是第一个子标签。 - dctucker

10

这是从 @adam_0 的答案中提取的,但使用 autocmd(根据 @romani 的答案),并包括如 @Paul 的评论所示的 syntax on

augroup XML
    autocmd!
    autocmd FileType xml let g:xml_syntax_folding=1
    autocmd FileType xml setlocal foldmethod=syntax
    autocmd FileType xml :syntax on
    autocmd FileType xml :%foldopen!
augroup END

:%foldopen! 命令会在文件加载时将所有折叠打开,以便所见即所得。但如果需要,zM 等命令也可以立即用于折叠。


1
你可以使用 autocmd FileType xml,ui,xhtml,html 命令来激活多个文件。 - albfan
1
我更喜欢使用autocmd FileType xml normal zR替换autocmd FileType xml :%foldopen! - phcerdan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接