Is it possible to jump to closed folds in Vim?

2019-02-02 10:10发布

In Vim, I frequently 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 frequently want to skip all the open folds, and just jump to the nearest closed fold.

Is there a way to do this? I see no built-in keymap in the manual.

2条回答
疯言疯语
2楼-- · 2019-02-02 10:20

No, there isn't (as far as I know) a build in method to do that. Interesting idea, though.

If I had some time at the moment, I might try to figure out a way to do it - unfortunatelly, being busy nowadays all I can suggest you is to look at the Detecting a folded line or an incremental search question (particularly the foldclosed function) and try to make a function yourself. Checking every line, if fold is open, skip ... something along those lines.

查看更多
看我几分像从前
3楼-- · 2019-02-02 10:22

Let me propose the following mappings implementing described behavior.

nnoremap <silent> <leader>zj :call NextClosedFold('j')<cr>
nnoremap <silent> <leader>zk :call NextClosedFold('k')<cr>
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
查看更多
登录 后发表回答