在Vim中复制和关闭折叠

4

虽然我已经使用Vim十年了,但有时候我仍然在折叠方面遇到困难。在Vim 7.3中,我使用foldmethod=marker和默认的foldmarkers,没有任何.vimrc文件。

考虑以下嵌套的折叠结构(使用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,但在zo后,fold4仍然保持打开状态。如果我使用zC,它会关闭fold3和fold0,但是当我执行2zo时,fold4仍然保持打开状态。这不是我期望递归折叠关闭的方式。是否有一种方法可以实现zc,同时也递归地关闭所有包含的折叠?
我工作的公司规定折叠由匹配对定义,没有明确的折叠级别,因此涉及明确折叠级别的解决方案无用。
1个回答

3
以下序列(在您的yyp之后)似乎可以满足您的需求: v% - 从光标下方的{选择到相应的} zC - 递归地关闭光标下方的所有折叠(不幸的是,这包括您希望保持打开的外部折叠) zv - 打开足够显示光标行的折叠 zc - 关闭新材料的单个外部折叠
当然,您需要将其映射到vimrc中的其他键组合。

这是一个非常好的解决方案,但我发现由于视觉选择而导致的屏幕闪烁有些分散注意力。 - Prince Goulash
1
如果您对此有强烈的感觉,可以先关闭高亮显示(hi Visual ...),然后再重新打开。但这可能会带来更多的麻烦,不值得这样做。 - Matthew Strawbridge
太好了!它需要进行一些微调才能在每种情况下都起作用,但你肯定解决了这个问题。谢谢。 - Prince Goulash

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