如何一次在整个文件中折叠到Vim中的特定级别

时间:2011-09-17 06:09:52

标签: vim

我想在Vim中按下一个按钮并折叠所有代码,这样只显示特定(和变量)缩进级别的代码。当我只想查看方法名称而不是它们的缩进例程时非常有用。

这个问题:Vim: Fold top level folds only有一个缩进级别的解决方案,但每次更改级别时都需要设置一个环境。

当我的光标处于缩进级别(比如级别2)时,我希望整个文件在所有方法中折叠到该缩进级别。

这是在某个地方内置到Vim吗?有没有人知道这样做的好插件?

3 个答案:

答案 0 :(得分:3)

配置由缩进定义的折叠

:setl foldmethod=indent

并尝试命令

:let &l:foldlevel = indent('.') / &shiftwidth

要快速访问此命令,请按如下方式为其创建映射。

:nnoremap <silent> <leader>z :let&l:fdl=indent('.')/&sw<cr>

答案 1 :(得分:0)

因为当foldmethod为expr时,foldnestmax不适用,所以当我遇到你的问题时,我找了别的东西。以下是我提出的建议,无疑可以改进:

function! <sid>CloseFoldOpens(opens_level)
    let lineno = 2
    let last = line("$")
    while lineno < last
        if foldclosed(lineno) != -1
            let lineno = foldclosedend(lineno) + 1
        elseif foldlevel(lineno) > foldlevel(lineno - 1)
        \ && foldlevel(lineno) == a:opens_level
            execute lineno."foldclose"
            let lineno = foldclosedend(lineno) + 1
        else
            let lineno = lineno + 1
        end
    endwhile
endfunction
nnoremap <silent> z1 :%foldclose<cr>
nnoremap <silent> z2 :call <sid>CloseFoldOpens(2)<cr>
nnoremap <silent> z3 :call <sid>CloseFoldOpens(3)<cr>
nnoremap <silent> z4 :call <sid>CloseFoldOpens(4)<cr>
nnoremap <silent> z5 :call <sid>CloseFoldOpens(5)<cr>

我更喜欢编号的地图,但是根据当前行的缩进,您可以选择以下内容:

nnoremap <silent> z. :call <sid>CloseFoldOpens(foldlevel('.'))<cr>zv

答案 2 :(得分:0)

不需要插件,它内置于Vim。

&#39;折叠级别&#39; (或更短的&#39; fdl&#39;)和&#39; foldnestmax&#39; (&#39; fdn&#39;)似乎就是我们想要的。您只需设置“折叠方法”即可。 (或更短的&#39; fdm&#39;)和&#39; foldnestmax&#39;你或.vimrc文件中的(或&#39; fdn&#39;):

set foldmethod=indent foldlevelstart=2 foldnestmax=2

或更短的版本:

set fdm=indent fdls=2 fdn=2

然后您可以使用直接命令更改折叠级别:zm或zr。