In Vim, I often find myself wanting to do a quick zk or zj to jump to the previous or next fold in a file. The problem is, I freq
Let me propose the following implementation of the described behavior.
nnoremap zj :call NextClosedFold('j')
nnoremap zk :call NextClosedFold('k')
function! NextClosedFold(dir)
let cmd = 'norm!z' . a:dir
let view = winsaveview()
let [l0, l, open] = [0, view.lnum, 1]
while l != l0 && open
exe cmd
let [l0, l] = [l, line('.')]
let open = foldclosed(l) < 0
endwhile
if open
call winrestview(view)
endif
endfunction
If it is desirable for the mappings to accept a count for the number of repetitions of the corresponding movement, one can implement a simple function for repeating any given command:
function! RepeatCmd(cmd) range abort
let n = v:count < 1 ? 1 : v:count
while n > 0
exe a:cmd
let n -= 1
endwhile
endfunction
and then redefine the above mappings as follows:
nnoremap zj :call RepeatCmd('call NextClosedFold("j")')
nnoremap zk :call RepeatCmd('call NextClosedFold("k")')