【问题标题】:Is it possible to jump to the next closed fold in Vim?是否可以跳到 Vim 中的下一个封闭折叠?
【发布时间】:2012-02-22 21:12:50
【问题描述】:

在 Vim 中,我经常发现自己想做一个快速的 zkzj 跳跃到文件中的上一个或下一个折叠。问题是,我经常想跳过所有打开的折叠,然后跳到最近的关闭折叠。

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

【问题讨论】:

    标签: vim code-folding


    【解决方案1】:

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

    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>
    

    【讨论】:

    • @大卫:谢谢!我已经对代码进行了重构,以简化跳跃循环并在所需方向没有闭合折叠时保持光标在原位。 (后一种行为符合zj/zk 命令在下方/上方找不到折叠时的行为。)
    • @ib。您能提供更改后的脚本吗?
    • @Glenn:如果您参考我在评论中提到的重构,答案中的代码已经更新为包含它。
    • 有什么办法可以调整这个函数来允许计数,比如[count]&lt;leader&gt;zj
    • @travisw:有。我已经更新了答案,以显示一种方法来支持建议映射中的重复计数。
    【解决方案2】:

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

    如果我现在有时间,我可能会想办法做到这一点 — 不幸的是,现在很忙,我只能建议你看看 Detecting a folded line or an incremental search问题(尤其是foldclosed 函数)并尝试自己创建一个函数。检查每一行,如果折叠是打开的,跳过……沿着这些行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-02-08
      • 2011-12-01
      • 2023-03-13
      • 1970-01-01
      • 2013-12-07
      • 1970-01-01
      • 1970-01-01
      • 2020-02-04
      相关资源
      最近更新 更多