我选择了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按照我想要的方式运行?
答案 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
使映射非递归,因此即使您重新定义zj
和zk
,您也可以始终恢复其默认行为。然后,我们只需将zj
和zk
映射到您想要的行为。