33

在 Vim 中,我经常发现自己想要快速zkzj跳到文件中的上一个或下一个折叠处。问题是,我经常想跳过所有打开的折叠,而只是跳到最近的闭合折叠。

有没有办法做到这一点?我在帮助中没有看到内置的键盘映射。

4

2 回答 2

36

让我提出所描述行为的以下实现。

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

如果希望映射接受相应运动的重复次数的计数,可以实现一个简单的函数来重复任何给定的命令:

function! RepeatCmd(cmd) range abort
    let n = v:count < 1 ? 1 : v:count
    while n > 0
        exe a:cmd
        let n -= 1
    endwhile
endfunction

然后重新定义上述映射如下:

nnoremap <silent> <leader>zj :<c-u>call RepeatCmd('call NextClosedFold("j")')<cr>
nnoremap <silent> <leader>zk :<c-u>call RepeatCmd('call NextClosedFold("k")')<cr>
于 2012-02-23T04:06:00.010 回答
1

不,据我所知,没有内置方法可以做到这一点。不过,有趣的想法。

如果我现在有时间,我可能会想办法去做——不幸的是,现在很忙,我只能建议你看看检测折叠线或增量搜索问题(特别是foldclosed函数) 并尝试自己创建一个函数。检查每一行,如果折叠是打开的,跳过……沿着这些线的东西。

于 2012-02-23T03:06:45.070 回答