当光标触摸时,你能让Vim自动展开折叠吗?
答案 0 :(得分:5)
请参阅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
一个较低但有点节俭的解决方案是在每一个上打开一个折叠 光标移动。
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