🌬️
Vimで空行挿入+dot repeat
空行を挿入する
文書を編集していると、現在行の前後に空行を挿入したいことがよくあります。
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
Discussion
元々autoloadに置いていたのだと思います。
mi#blank#above/belowが残っているので機能しないかと。ご指摘ありがとうございます 直しました