Faça os movimentos {} do vim pularem as dobras


3

Eu amo vim { e } movimentos, que saltam para a linha vazia seguinte / anterior.

Eu estive recentemente usando mais dobras, e embora seja um ótimo recurso, ele não faz o que eu esperaria com relação ao { e } moções. Se houver uma linha vazia na dobra, então { e } vai pousar lá, abrindo assim a dobra.

Existe uma maneira de remapear { e } pular dobras completamente? Ou seja, mesmo que houvesse linhas vazias dentro de uma dobra, { e } não pararia por aí, mas procuraria a próxima linha vazia desdobrada? Isso se encaixaria melhor com o que eu esperaria.

Respostas:


8

Primeira pergunta:

Você deve remover block a partir do valor padrão de 'foldopen':

set foldopen-=block

Vejo :help 'foldopen'.

Segunda questão:

Você pode tentar esses mapeamentos

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

Isso é muito melhor, obrigado! Mas não é bem o que eu pedi. Eu quero pular dobras completamente, de tal forma que, mesmo se houver uma linha vazia, o cursor não pára por aí { ou }.
Jeff Terrell Ph.D.

Minha resposta endereçou sua primeira pergunta. Se você tiver várias perguntas, pergunte a elas separadamente. Se todos eles estiverem ligados por um assunto comum, pergunte sobre esse assunto.
romainl

@ JeffTerrellPh.D. por favor veja minha edição.
romainl

Obrigado pelo seguimento. o nnoremap comandos fazem com que menos linhas vazias dobradas capturem o cursor, mas se houver duas linhas vazias em uma única dobra, a segunda ainda pegará o cursor. Eu quero pular todos linhas vazias dobradas, não apenas algumas. Além disso, eu só pretendia fazer uma pergunta. A segunda questão acima pretendia esclarecer a intenção da primeira questão, não colocar uma questão nova. Obrigado!
Jeff Terrell Ph.D.

Atualmente, você tem duas perguntas sobre o superusuário, que deveriam ter sido feitas juntas.
romainl

0

Este método leva em consideração múltiplas dobras consecutivas.

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>
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.