15

我有一个 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 ---

任何建议表示赞赏!谢谢!

4

3 回答 3

6

%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---------------------------
于 2010-07-09T15:13:00.993 回答
4

如果你想一直使用 "manual" 以外的折叠方法,请将此行添加到 ~/.vimrc:
set foldmethod=foldoption

我建议使用 foldmethod=indent。这将根据任何缩进折叠。然后,如果您更改输入以包含您希望发生折叠的缩进。例如,如果您将输入更改为

---
title: My Title
    other attrs: other values
---
title: Next Item
---
title: One More Item
...

它会像你描述的那样折叠

于 2010-07-09T12:16:20.420 回答
4

查看 pedro 的 yaml-vim-plugin 以获得符合您确切要求的改进折叠。

在pedro 的博客上阅读有关该插件 的更多信息,或直接在 github 上以pedrohdz/vim-yaml-folds找到它

YAML 文件的默认 Vim 折叠规则对我来说总是有点眼花缭乱。折叠命令的行为也不像人们期望的那样。在下面的解释部分中了解更多关于这一切的信息。

这让我组合了一个快速简单的 Vim 插件来更干净地处理 YAML 折叠,vim-yaml-folds。这是安装了 vim-yaml-folds 的 YAML 折叠的样子:来自 blogpost 的折叠 yaml 示例

一个折叠包含一个 YAML 部分的开头,其中包含它下面的所有内容。

如果您知道我在说什么并且不关心解释,请随意跳过解释并安装 vim-yaml-folds 如果您愿意。

于 2019-11-07T04:11:59.670 回答