3

Мне нравятся движения vim { и } , которые переходят на следующую / предыдущую пустую строку.

Я недавно использовал больше сворачивания, и, хотя это отличная функция, она не выполняет то, что я ожидал в отношении движений { и } . Если в сгибе есть пустая строка, то { и } приземлится там, открывая сгиб.

Есть ли способ переназначить { и } чтобы вообще пропустить сгибы? То есть, даже если бы внутри сгиба были пустые строки, { и } не останавливались бы на этом, а искали бы следующую развернутую пустую строку? Это будет лучше соответствовать тому, что я ожидал.

2 ответа2

8

Первый вопрос:

Вы должны удалить block из значения по умолчанию 'foldopen':

set foldopen-=block

Смотрите :help 'foldopen' .

Второй вопрос:

Вы можете попробовать эти сопоставления

nnoremap <expr> } foldclosed(search('^$', 'Wn')) == -1 ? "}" : "}j}"
nnoremap <expr> { foldclosed(search('^$', 'Wnb')) == -1 ? "{" : "{k{"
0

Этот метод учитывает несколько последовательных сгибов.

function! s:SkipFold(direction) abort
  let l:currentLine = line('.')
  while foldclosed(l:currentLine) != -1
    let l:currentLine = search('^$', (a:direction ? 'Wn' : 'Wnb'))
    if l:currentLine == 0
      if a:direction
        call cursor(line('$'), strlen(getline(line('$'))))
      else
        call cursor(1, 1)
      endif
      break
    endif
    call cursor(l:currentLine, 0)
  endwhile
endfunction

nnoremap <silent>} }:call <SID>SkipFold(1)<cr>
nnoremap <silent>{ {:call <SID>SkipFold(0)<cr>

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .