🌬️

Vimで空行挿入+dot repeat

2022/12/01に公開
2

空行を挿入する

文書を編集していると、現在行の前後に空行を挿入したいことがよくあります。
Vimではo<esc>/O<esc>で、「前後の行に改行しつつ挿入モードに入り、すぐにノーマルモードに戻る」という動作ができます。

これを挿入モードに入らずに行う方法をご紹介します。

function! s:blank_above(type = '') abort
  if a:type == ''
    set operatorfunc=function('s:blank_above')
    return 'g@ '
  endif

  put! =repeat(nr2char(10), v:count1)
  normal! '[
endfunction

function! s:blank_below(type = '') abort
  if a:type == ''
    set operatorfunc=function('s:blank_below')
    return 'g@ '
  endif

  put =repeat(nr2char(10), v:count1)
endfunction

nnoremap <expr> <Space>o <sid>blank_below()
nnoremap <expr> <Space>O <sid>blank_above()

これで<Space>oで次の行に、<Space>Oで前の行に空行が挿入され、そこにカーソルが移動します。

  • putコマンドにnr2char(10)(改行)を渡して空行挿入を行う
  • v:count1を使ってカウントに対応
  • operatorfunc<expr>マップを使ってドットリピートに対応

カーソルを移動しないバージョン

上記の設定では空行が挿入された先にカーソルが移動しますが、移動を発生させたくない場合はappend()を使用すれば解決できます。

 function! s:blank_above(type = '') abort
   if a:type == ''
     set operatorfunc=function('s:blank_above')
     return 'g@ '
   endif

-  put! =repeat(nr2char(10), v:count1)
-  normal! '[
+  for i in range(v:count1)
+    call append(line('.')-1, '')
+  endfor
 endfunction

 function! s:blank_below(type = '') abort
   if a:type == ''
     set operatorfunc=function('s:blank_below')
     return 'g@ '
   endif

-  put =repeat(nr2char(10), v:count1)
+  for i in range(v:count1)
+    call append(line('.'), '')
+  endfor
 endfunction

 nnoremap <expr> <Space>o <sid>blank_below()
 nnoremap <expr> <Space>O <sid>blank_above()

tribute

https://deris.hatenablog.jp/entry/20130404/1365086716

https://vim-jp.org/vim-users-jp/2009/08/15/Hack-57.html

Discussion

uga-rosauga-rosa

元々autoloadに置いていたのだと思います。mi#blank#above/belowが残っているので機能しないかと。