Поскольку foldnestmax не применяется, когда метод foldold expd истек, я искал что-то еще, когда натолкнулся на ваш вопрос. Вот то, что я придумал, что несомненно может быть улучшено:
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