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-インデント-オブジェクト?

答え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

関連情報