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

时间:2011-08-11 23:45:58

标签: vim

当光标触摸时,你能让Vim自动展开折叠吗?

3 个答案:

答案 0 :(得分:5)

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

请注意,垂直移动不会打开封闭的折叠。此外, foldopen中没有设置来启用此行为。当hor项目是 在foldopen选项中设置,要打开折叠,可以使用hl或其他 水平移动命令。如果自动打开至关重要 任何接触它的光标移动都可以折叠,可以解决这个问题 通过重新映射垂直移动命令的一些子集,如下所示。

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

一个较低但有点节俭的解决方案是在每一个上打开一个折叠 光标移动。

autocmd CursorMoved,CursorMovedI * silent! foldopen

不幸的是,这个解决方案并不普遍。折下之后 光标打开,光标位于该折叠的第一行。如果 这种行为是不可取的,可以遵循垂直方向 一个动作,并在光标处将光标放在折叠的最后一行 正在自下而上。

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

但是,如果移动跳过折叠,则不会打开折叠。对于 例如,在折叠上方的行上的2j会将光标放在该行上 就在那个折叠之后,而不是它的第二行。

答案 1 :(得分:3)

set foldopen=all

似乎做你想做的事。您还可以为光标移动进行自动命令:

au CursorMoved * call AutoOpen()

调用类似的函数:

function! AutoOpen()
  if foldclosed(".") == line(".")
    call feedkeys("zo")
  endif
endfunction

如果您希望它也能在插入模式下工作,请使用:

au CursorMoved,CursorMovedI * call AutoOpen()

答案 2 :(得分:1)

:help fdo可能:help fcl可能会对您有所帮助。我在.vimrc中有这一行:

set foldopen=block,hor,insert,jump,mark,percent,quickfix,search,tag,undo