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

时间:2014-07-13 19:09:18

标签: vim

我选择了this handy function来跳过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按照我想要的方式运行?

1 个答案:

答案 0 :(得分:1)

听起来你想要这个。

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映射到您想要的行为。