Ändern von Vim-Absatzsprungbefehlen in Zeilen oder Codeblöcke mit Leerzeichen

Ändern von Vim-Absatzsprungbefehlen in Zeilen oder Codeblöcke mit Leerzeichen

1) Mit den Befehlen { und } in vim kann ich zur vorherigen oder nächsten komplett leeren Zeile (oder zum Anfang oder Ende der Datei) springen. Wie ändere ich diese Befehle, um zur vorherigen oder nächsten Zeile zu springen, die komplett leer ist oder nur Leerzeichen enthält (oder zum Anfang oder Ende der Datei)?

2) Wie erstelle ich Befehle, um an den Anfang oder das Ende des aktuellen Codeblocks zu springen, der durch den aktuellen Einzug definiert ist? Ich möchte beispielsweise einfach von Zeile F zu Zeile D oder G (oder zu Zeile C oder H) wechseln:

A
  B
  C
    D
    E
    F
    G
  H
I

Antwort1

Frage 1 scheint relativ einfach (und meine Antwort wahrscheinlich etwas naiv):

nnoremap } /^\s*$<CR>
nnoremap { ?^\s*$<CR>

Aber ich denke, Sie sollten eine andere Abkürzung finden.

Außerdem müssen Sie bereits ggzur ersten Zeile des Puffers und Gzur letzten Zeile springen. Ist das nicht genug?

Ich weiß nicht, wie ich Frage 2 auf einfache Weise beantworten soll. Haben Sie versuchtvim-einrücken-objekt?

Antwort2

Durch die Kombination der tollen Tipps von Romainl und Garyjohn habe ich genau die Funktionalität erhalten, die ich für Teil 1 gesucht habe:

nnoremap <silent> { :call MyPrevParagraph()<CR>
nnoremap <silent> } :call MyNextParagraph()<CR>

function MyNextParagraph()
  let myline = search('^\s*$', 'W')
  if myline <= 0
    execute 'normal! G$'
  else
    execute 'normal! '.myline.'G0'
  endif
endfunction

function MyPrevParagraph()
  let myline = search('^\s*$', 'bW')
  if myline <= 0
    execute 'normal! gg0'
  else
    execute 'normal! '.myline.'G0'
  endif
endfunction

verwandte Informationen