Since foldnestmax does not apply when foldmethod is expr, I was looking for something else when I came across your question. Here is what I came up with that can undoubtedly be improved:
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>
I prefer numbered maps, but for you based on the indentation of the current line, something like these lines:
nnoremap <silent> z. :call <sid>CloseFoldOpens(foldlevel('.'))<cr>zv
source share