我有一个YAML格式的文本文件,并希望为VIM定义自定义折叠,但我不知道如何去做(尽管阅读了折叠的VIM文档).该文件由YAML"文档"组成,如下所示:
---
title: My Title
attr1: value1
attr2: value2
---
title: Next Item
attr1: value3
---
title: One More Item
...
Run Code Online (Sandbox Code Playgroud)
我希望得到的折叠文本看起来像这样:
+---- 2 lines: My Title ----
+---- ? lines: Next Item ---
Run Code Online (Sandbox Code Playgroud)
任何建议表示赞赏!谢谢!
查看 pedro 的 yaml-vim-plugin 以改进折叠,以满足您的具体要求。
在pedro 的博客上阅读有关该插件的更多信息 ,或者直接在 github 上找到它:pedrohdz/vim-yaml-folds
YAML 文件的默认 Vim 折叠规则对我来说总是有点眼疲劳。折叠命令的行为也不像人们所期望的那样。有关这一切的更多信息,请参见下面的解释部分。
这让我组装了一个快速简单的 Vim 插件来更干净地处理 YAML 折叠,vim-yaml-folds。安装了 vim-yaml-folds 后,YAML 折叠如下所示:
折叠包含 YAML 部分的开头以及其下面的所有内容。
如果您知道我在说什么并且不关心解释,请随意跳过解释并安装 vim-yaml-folds(如果您愿意)。
如果你想一直使用“手动”以外的折叠方法,请将此行添加到你的 ~/.vimrc 中:
set Foldmethod=foldoption
我建议使用foldmethod=indent。这将根据任何缩进折叠。然后,如果您更改输入以包含您希望发生折叠的缩进。例如,如果您将输入更改为
---
title: My Title
other attrs: other values
---
title: Next Item
---
title: One More Item
...
Run Code Online (Sandbox Code Playgroud)
它将按照您所描述的方式折叠
做
%s/---\(.*\)\(\_.\{-}title: \)\(.*\)/---\1 #{{{1 \3\2\3/g
set foldmethod=marker
Run Code Online (Sandbox Code Playgroud)
要么
%s/\(---\_.\{-}title: \)\(.*\)/#{{{1 \2\r\1\2/g
set foldmethod=marker
Run Code Online (Sandbox Code Playgroud)
这将在每个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
...
Run Code Online (Sandbox Code Playgroud)
折叠:
+-- 4 ?????: --- My Title-----------------------------
+-- 3 ?????: --- Next Item----------------------------
+-- 3 ?????: --- One More Item------------------------
Run Code Online (Sandbox Code Playgroud)
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
...
Run Code Online (Sandbox Code Playgroud)
折叠:
+-- 5 ?????: My Title--------------------------------
+-- 4 ?????: Next Item-------------------------------
+-- 4 ?????: One More Item---------------------------
Run Code Online (Sandbox Code Playgroud)