См. Параметр 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
на линии чуть выше сгиба поместит курсор на линию сразу после этого сгиба, а не на вторую строку в нем.