4

尽管使用 Vim 已有十年,但有时我仍然为折叠而苦恼。在 Vim 7.3 中没有 .vimrc 的情况下,这个问题中的所有内容都是可重现的。我将 foldmethod=marker 与默认折叠标记一起使用。

考虑以下嵌套折叠结构(使用 foldmethod=marker 和默认标记)。第一列是行号(fold0 的缩进为零)。

 1|{{{ fold0
 2|    {{{ fold1
 3|        {{{ fold2
 4|        }}}
 5|    }}}
 6|}}}

假设fold1fold2都关闭并且光标位于第 2 行。我可以使用 拉出并放置关闭的折叠yyp,但新插入的折叠都是打开的。

我想要的是关闭“放置”命令产生的折叠。或者,是否有一种方便的方法可以在“放置”之后关闭它们?也就是说,从这个位置(光标在第 6 行):

 1|{{{ fold0
 2|+---  4 lines: fold1----------------------------------------
 6|    {{{ fold3
 7|        {{{ fold4
 8|        }}}
 9|    }}}
10|}}}

我可以zc用来关闭 fold3,但 fold 4 在zo. 如果改为使用zC,它会关闭 fold3 并折叠 0,但当我这样做时,折叠 4 仍然打开2zo。这不是我期望递归折叠关闭的工作方式。有没有办法实现zc但也递归地关闭所有包含的折叠?

我工作的公司指定折叠是通过匹配对来定义的,而没有明确的折叠级别,因此涉及显式折叠级别的解决方案是没有用的。

4

1 回答 1

3

以下序列(在您的 之后yyp)似乎可以满足您的要求:

v%- 直观地从{光标下选择到相应的}

zC- 递归关闭光标下的所有折叠(不幸的是,这包括您想要保持打开的外部折叠)

zv- 打开足够的折叠以显示光标线

zc- 关闭新材料的单个外折叠

当然,您希望将其映射到 vimrc 中的其他一些组合键。

于 2012-12-14T22:28:44.423 回答