2012-01-04 93 views
0

在大型PHP应用程序中,我想折叠当前块中的所有代码块,但不是当前块本身。例如:VIM:折叠当前块内的所有代码块

if ($something) { 

    if ($another) { 
     // some code; 
    } 

    | <--THIS IS MY CURRENT CURSOR POSITION 

    if ($yetAnother) { 
     // more code; 
    } 

    if ($stillAnother) { 
     // yet more code; 
    } 

} 

我如何可以折叠的三个内部if秒,但没有外if

谢谢!

+1

您是否已经在使用foldmethod = syntax/indent? – sehe 2012-01-04 22:37:21

回答

1

我可以想出最接近的事是zMzv。这将关闭所有折叠(zM),然后打开足够的折叠以查看光标所在的线(zv)。如有必要,您可以将其映射到较短的命令。

这并不完全符合您的要求,因为它会关闭外部if声明以外的所有折叠。

+0

谢谢。关闭外部'if'语句之外的所有折叠是一个功能,而不是bug!不过,我确实必须重写折叠标记。 – dotancohen 2012-01-05 21:18:05

4

见,如果这个工程:

:set foldmethod=marker foldmarker={,} foldlevel=2 
+1

我不得不'foldlevel = 1“,但是它运行得非常好。我从来没有想过重叠foldmarker到一些如此微不足道的东西。它在实践中有缺点吗? – sehe 2012-01-04 22:39:23

+1

我从来没有过使用单字符折叠标记的问题,但那是一个轶事。 – holygeek 2012-01-04 22:51:33

+0

还是赞赏! – sehe 2012-01-05 01:40:43

2

如果我的问题是正确的,则 中所述的折叠更改等同于以下一系列操作。

  1. 关闭当前折叠(光标所在的位置)。
  2. 递归关闭刚关闭的所有折叠。
  3. 打开当前折叠,保持内折叠关闭。

映射

:nnoremap <silent> <leader>f m`zcVzCzo`` 

因此运行对应的命令于上述步骤, 保存光标位置完成之前,和之后恢复它。