请参阅foldopen选项.如果光标移动到闭合折叠中,它控制哪些命令组将导致打开折叠.
但请注意,垂直移动不会打开封闭的折叠.此外,没有设置foldopen启用此行为.当hor在foldopen选项中设置项目时,要打开可以使用的折叠h,l或其他水平移动命令.如果在接触它的任何光标移动上自动打开折叠是至关重要的,则可以通过重新映射垂直移动命令的一些子集来解决此问题,如下所示.
nnoremap <silent> j :<c-u>call MoveUpDown('j', +1, 1)<cr>
nnoremap <silent> k :<c-u>call MoveUpDown('k', -1, 1)<cr>
nnoremap <silent> gj :<c-u>call MoveUpDown('gj', +1, 1)<cr>
nnoremap <silent> gk :<c-u>call MoveUpDown('gk', -1, 1)<cr>
nnoremap <silent> <c-d> :<c-u>call MoveUpDown("\<lt>c-d>", +1, '&l:scroll')<cr>
nnoremap <silent> <c-u> :<c-u>call MoveUpDown("\<lt>c-u>", -1, '&l:scroll')<cr>
nnoremap <silent> <c-f> :<c-u>call MoveUpDown("\<lt>c-f>", +1, 'winheight("%")')<cr>
nnoremap <silent> <c-b> :<c-u>call MoveUpDown("\<lt>c-b>", -1, 'winheight("%")')<cr>
function! MoveUpDown(cmd, dir, ndef)
let n = v:count == 0 ? eval(a:ndef) : v:count
let l = line('.') + a:dir * n
silent! execute l . 'foldopen!'
execute 'norm! ' . n . a:cmd
endfunction
Run Code Online (Sandbox Code Playgroud)
一个较低但有点节俭的解决方案是在每个光标移动时打开一个折叠.
autocmd CursorMoved,CursorMovedI * silent! foldopen
Run Code Online (Sandbox Code Playgroud)
不幸的是,这种解决方案并不普遍.打开光标下的折叠后,光标位于该折叠的第一行.如果不希望出现这种情况,可以按照移动的垂直方向,并在光标自下而上移动时将光标放在折叠的最后一行.
autocmd CursorMoved,CursorMovedI * call OnCursorMove()
function! OnCursorMove()
let l = line('.')
silent! foldopen
if exists('b:last_line') && l < b:last_line
norm! ]z
endif
let b:last_line = l
endfunction
Run Code Online (Sandbox Code Playgroud)
但是,如果运动跳过折叠,则不会打开折叠.例如,2j在折叠上方的线上将光标放在该折叠之后的线上,而不是其中的第二条线.