我喜欢 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>