изменение команд перехода по абзацам vim на строки или блоки кода, содержащие пробелы

изменение команд перехода по абзацам vim на строки или блоки кода, содержащие пробелы

1) С помощью команд { и } в vim я могу перейти на предыдущую или следующую полностью пустую строку (или начало или конец файла). Как мне изменить эти команды, чтобы перейти на предыдущую или следующую строку, которая полностью пуста или содержит только пробелы (или начало или конец файла)?

2) Как создать команды для перехода к началу или концу текущего блока кода, определенного текущим отступом? Например, я хочу легко перейти от строки F к строке D или G (или к строке C или H):

A
  B
  C
    D
    E
    F
    G
  H
I

решение1

Вопрос 1 кажется относительно простым (и мой ответ, вероятно, немного наивен):

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

Но я думаю, вам следует найти другой короткий путь.

Также вам уже нужно ggперейти на первую строку буфера и Gперейти на его последнюю строку. Разве этого не достаточно?

Я не знаю, как ответить на вопрос 2 простым языком. Вы пробовалиvim-indent-объект?

решение2

Объединив замечательные советы romainl и garyjohn, я получил именно ту функциональность, которую искал для части №1:

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

Связанный контент