2012-12-14 63 views
4

尽管使用Vim十年,有时候我仍然在折叠中挣扎。这个问题中的所有内容都可以在Vim 7.3中重现,没有.vimrc。我正在使用foldmethod =标记与默认foldMarkkers。复制和关闭Vim中的折叠

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

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

假设fold1fold2都关闭,光标在第2行,我可以抽出,并把使用yyp封闭折,但新插入的褶皱全部开放。

我想要的是由“put”命令导致的折叠被关闭。或者,在“put”之后是否有方便的方法来关闭它们?也就是说,从这个位置(用光标在第6行):

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

我可以使用zc关闭fold3,但折4保持zo后打开。如果我使用zC,它会关闭折叠3和折叠0,但当我做2zo时折叠4仍然打开。这不是我期望递归折叠工作的方式。有没有办法实现zc,但也递归地关闭所有折叠?

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

回答

2

下面的序列(你Ÿ后Ÿp)似乎做你想要什么:

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

zC - 关闭光标下的折叠递归(不幸的是,这包括要保持开放外倍)

žv - 仅打开足够的折叠显示光标线

žc - 关闭新材料的单个外部折叠

当然,您希望将此映射到您的vimrc中的某个其他组合键。

+0

这是一个非常好的解决方案,但我发现屏幕由于视觉选择而闪烁,相当分散注意力。 –

+1

如果您对此感觉强烈,可以先关闭突出显示('hi Visual ...'),然后再打开。但是这可能比它的价值更麻烦。 –

+0

优秀!在每一种情况下都需要进行一些调整,但你已经解决了这个问题。谢谢。 –