🌬️
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
が残っているので機能しないかと。ご指摘ありがとうございます 直しました