繁体   English   中英

使用引导键对vim重新映射折叠导航

[英]vim remap fold navigation using leader key

我选择了这个方便的功能来跳过vim中的闭合折叠:

let mapleader = ","
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

正如你所看到的,我的leader键设置为,

因此,现在如果我发出命令,zj我的光标将移至下一个关闭的折叠。 但是,我想要的是让zj命令默认移动到下一个折叠,而我想让,zj移动到下一个折叠(打开或关闭)。

编写重新映射以使我的vim表现出我想要的方式的最优雅的方法是什么?

听起来像您想要这样。

nnoremap <silent> <leader>zj zj
nnoremap <silent> <leader>zk zk
nnoremap <silent> zj :call NextClosedFold('j')<cr>
nnoremap <silent> 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

nnoremap使映射成为非递归的,因此,即使您重新定义zjzk ,也始终可以恢复其默认行为。 然后,我们只需将zjzk映射到所需的行为即可。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM