VIM:折叠当前块中的所有代码块

VIM:折叠当前块中的所有代码块,vim,Vim,在大型PHP应用程序中,我希望折叠当前块中的所有代码块,而不是当前块本身。例如: if ($something) { if ($another) { // some code; } | <--THIS IS MY CURRENT CURSOR POSITION if ($yetAnother) { // more code; } if ($stillAnother) { // yet m

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

if ($something) {

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

    | <--THIS IS MY CURRENT CURSOR POSITION

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

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

}
if($something){
若有(另加){
//一些代码;
}
|看看这是否有效:

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

我能想到的最接近的东西是zMzv。它将关闭所有折叠(zM),然后打开足够的折叠以查看光标所在的行(zv)。如果需要,您可以将其映射到较短的命令


这不完全是你想要的,因为它也会关闭你的外部
if
语句之外的所有折叠。

如果我答对了问题,语句中描述的折叠变化 相当于以下操作序列

  • 关闭当前折叠(光标位于其中)
  • 递归关闭刚刚关闭的折叠中的所有折叠
  • 打开当前折叠,保持内部折叠关闭
  • 映射

    :nnoremap <silent> <leader>f m`zcVzCzo``
    
    :nnoremap f m`zcVzCzo``
    
    因此,运行与上述步骤对应的命令,
    在完成之前保存光标位置,然后再恢复。

    您是否已经在使用foldmethod=syntax/indent?我必须
    foldlevel=1
    ,但效果非常好。我从未想过将foldmarker覆盖到如此琐碎的内容。它在实践中有缺点吗?我从来没有遇到过一个字符fol的问题d标记,但那只是个轶事。谢谢,似乎foldmarkers实际上给我带来了麻烦。按照你的建议覆盖它们会有所帮助。谢谢。关闭外部
    if
    语句之外的所有折叠是一个功能,而不是一个bug!不过我必须覆盖foldmarkers。