我想在Vim中按下一个按钮并折叠所有代码,这样只显示特定(和变量)缩进级别的代码。当我只想查看方法名称而不是它们的缩进例程时非常有用。
这个问题:Vim: Fold top level folds only有一个缩进级别的解决方案,但每次更改级别时都需要设置一个环境。
当我的光标处于缩进级别(比如级别2)时,我希望整个文件在所有方法中折叠到该缩进级别。
这是在某个地方内置到Vim吗?有没有人知道这样做的好插件?
答案 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。