Есть ли способ автоматически развернуть фолд Vim, когда на него наведут курсор? - PullRequest
8 голосов
/ 12 августа 2011

Можете ли вы, чтобы Vim автоматически расширял фолд, когда курсор касался его?

Ответы [ 3 ]

5 голосов
/ 12 августа 2011

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

3 голосов
/ 12 августа 2011
set foldopen=all

, кажется, делает то, что вы хотите.Вы также можете сделать автокоманду для перемещения курсора:

au CursorMoved * call AutoOpen()

, вызывая такую ​​функцию, как:

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

Если вы хотите, чтобы это также работало в режиме вставки, используйте:

au CursorMoved,CursorMovedI * call AutoOpen()
1 голос
/ 12 августа 2011

:help fdo и, возможно, :help fcl могут вам помочь.У меня есть эта строка в моем .vimrc:

set foldopen=block,hor,insert,jump,mark,percent,quickfix,search,tag,undo
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...