如何在VIM中折叠YAML条目?

16

我有一个YAML格式的文本文件,想在VIM中定义自定义折叠,但我不知道如何操作(尽管已阅读了VIM关于折叠的文档)。该文件由YAML“文档”组成,如下所示:

---
title: My Title
attr1: value1
attr2: value2
---
title: Next Item
attr1: value3
---
title: One More Item
...

我希望最终的折叠文本看起来像这样:

+---- 2 lines: My Title ----
+---- ? lines: Next Item ---

欢迎提出任何建议!谢谢!

3个回答

6

Do

%s/---\(.*\)\(\_.\{-}title: \)\(.*\)/---\1 #{{{1 \3\2\3/g
set foldmethod=marker

或者

%s/\(---\_.\{-}title: \)\(.*\)/#{{{1 \2\r\1\2/g
set foldmethod=marker

这将在每个YAML文档的开头添加标题注释,并保持文档有效。foldmarker选项必须不变。
结果:
1.
--- #{{{1 My Title
title: My Title
attr1: value1
attr2: value2
--- #{{{1 Next Item
title: Next Item
attr1: value3
--- #{{{1 One More Item
title: One More Item
...

折叠:

+--  4 строк: --- My Title-----------------------------
+--  3 строк: --- Next Item----------------------------
+--  3 строк: --- One More Item------------------------

2.

#{{{1 My Title
---
title: My Title
attr1: value1
attr2: value2
#{{{1 Next Item
---
title: Next Item
attr1: value3
#{{{1 One More Item
---
title: One More Item
...

折叠:

+--  5 строк: My Title--------------------------------
+--  4 строк: Next Item-------------------------------
+--  4 строк: One More Item---------------------------

谢谢你的回答!我不清楚如何使用标记,这个答案肯定解决了我的问题。然而,为了避免重复数据,有没有一种方法让VIM使用你提供的正则表达式自动确定折叠级别,并带有标题? - wkranec
@wkranec 我认为可以使用设置正确的foldexprfoldtext,并使用foldmethod=expr来完成,但我从未使用过。 - ZyX

4
如果您想始终使用除“manual”以外的折叠方法,请将以下行添加到您的~/.vimrc文件中:
set foldmethod=foldoption
我建议使用foldmethod=indent。这将基于任何缩进进行折叠。然后,如果您更改输入以包括要发生折叠的缩进。例如,如果您更改输入为:
---
title: My Title
    other attrs: other values
---
title: Next Item
---
title: One More Item
...

它会像您描述的那样折叠。

抱歉上次的评论。我是SO的新手,不知道内联代码不起作用(由于某种原因我无法再编辑)。 - wkranec
是的,那是我的错,我误读了你的原始输入。我以为它已经有了嵌套关系。你可以使用set foldmethod=marker代替。与此同时,你可以使用set foldmarker=mmm,nnn,其中mmm是起始标记,nnn是结束标记。所以我会尝试set foldmarker=---,---(假设在YAML中---是折叠的OK标记/分隔符)。希望这可以帮助到你。 - Eric LaForce
再次感谢你,Eric。我之前尝试过你描述的标记方法,但是VIM会折叠整个文档(或者如果你试图在文档中间创建一个折叠,它会折叠到文件末尾的所有项目(因为实际上没有一个结束的“---”)。 - wkranec
你可以缩进整个YAML文档(---\n\ \ \ \ title: 1\n\ \ \ \ other attr: other value\n---\n\ \ \ \ title: 2\n...),这将导致---\n+-- 2 lines: title: 1---\n---\n+-- 2 lines: title: 2---。而且这仍然是一个有效的YAML文档,而@Eric LaForce的答案会使你的文档无效。 - ZyX

4

看看Pedro的yaml-vim-plugin,它可以提供符合您要求的改进折叠功能。

Pedro的博客上阅读更多关于该插件的信息,或者直接在github上找到它,名称为pedrohdz/vim-yaml-folds

对我来说,默认的Vim YAML文件折叠规则总是有些令人眼花缭乱。并且折叠命令的行为也不像人们所期望的那样,以下详细解释。

这促使我快速组合了一个简单的Vim插件来更清晰地处理YAML折叠,即vim-yaml-folds。下面是安装vim-yaml-folds后YAML折叠的外观:folded yaml example from blogpost

一个折叠包含一个YAML部分的开头和其中包含的所有内容。

如果您知道我在谈论什么并且不需要解释,请随意跳过解释并安装vim-yaml-folds。


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