当你把光标放在它上面时,有没有办法自动扩展Vim折叠?

dan*_*dan 8 vim

你可以让Vim在光标接触时自动展开折叠吗?

ib.*_*ib. 5

请参阅foldopen选项.如果光标移动到闭合折叠中,它控制哪些命令组将导致打开折叠.

但请注意,垂直移动不会打开封闭的折叠.此外,没有设置foldopen启用此行为.当horfoldopen选项中设置项目时,要打开可以使用的折叠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在折叠上方的线上将光标放在该折叠之后的线上,而不是其中的第二条线.