让 vim 的 {} 动作跳过折叠

让 vim 的 {} 动作跳过折叠

我喜欢 vim{}motions,它们可以跳转到下一个/上一个空行。

我最近更多地使用折叠,虽然这是一项很棒的功能,但它并没有像我期望的那样执行{}动作。如果折叠处有空行,则{}将落在那里,从而打开折叠。

有没有办法重新映射{}完全跳过折叠?也就是说,即使折叠内有空行,{}不会停在那里,而是寻找下一个未折叠的空行?这更符合我的预期。

答案1

第一个问题:

您必须block从默认值中删除'foldopen'

set foldopen-=block

:help 'foldopen'

第二个问题:

您可以尝试这些映射

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

答案2

该方法考虑了多个连续的折叠。

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>

相关内容