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

Folding (expanding and colapsing) xml tags in vim (xml parsing)

我知道 vim 中的 % 会从一个标签跳转到另一个标签,我也知道如何使用视觉模式 select 之间的整个块xml 文件中的标签,使用 o 从顶部跳转到底部标签。

我进行了多次网络搜索,并在我的 .vimrc:

中使用以下行安装了 matchit 插件
filetype plugin on
runtime macros/matchit.vim

我找到了 this post,并尝试了 closetag.vim。

我查看了巨大的 xml 文件,即使有多个显示器(和眼镜)也会发现能够折叠文件的某些部分很有用。


有没有办法在 MacVim 或 vim 默认情况下或通过使用插件折叠和展开标签之间的部分?

您需要的功能称为 "folding"。

基本上,您告诉 Vim 使用其中一个可用的 'foldmethod' 并使用 zazrzM。您可以在 :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'

缩进方法几乎对我有用,但我发现它的工作方式有点奇怪;本质上,它折叠在标签的 content 而不是标签本身。这对我有用,来自 the Vim wiki:

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">------------------------------------

这取自@adam_0的回答,但使用自动命令(根据@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 和朋友们可以立即折叠,如果你愿意的话。