vimで縦に連番を入力する

vim/gvimで縦に連続した番号へ置換したいときがあります。

fuga[0]
fuga[0]
fuga[0]

これを次のように変更したりする場合です。

fuga[0]
fuga[1]
fuga[2]


適当なのが見あたらなかったので、適当に作ってみたものを使用しています。
.vimrc(_vimrc) に追加して使います。

nnoremap <silent> co :ContinuousNumber <C-a><CR>
vnoremap <silent> co :ContinuousNumber <C-a><CR>
command! -count -nargs=1 ContinuousNumber let snf=&nf|set nf-=octal|let cl = col('.')|for nc in range(1, <count>?<count>-line('.'):1)|exe 'normal! j' . nc . <q-args>|call cursor('.', cl)|endfor|unlet cl|unlet snf

使い方

カーソルを連番に置換したい数値に合わせて 3co と実行すると、縦に3行分が連番に置換されます。
ビジュアルモードで選択してから co だと選択行が連番に変更されます。
を使用しているので、連番変更の対象になるのはカーソル位置から最も近い右側の数字です。
必ずしも数値の上でなければいけないという事はありません。
ただし対象範囲は全て同じ数字(開始値)にしておく必要があります。
また puyo1, puyo2, ...のような数値にも有効です。

fuga[2][1]
fuga[2][1]
fuga[2][1]

puyo1
puyo1
puyo1


数値が不揃いの場合は

  1. で数値部分を矩形選択
  2. s0 などとして連番の初期値に置換
  3. gvで範囲再選択
  4. co

という感じに、整形してから連番変更すると良いのではないかと思います。


ビジュアルモードでは に割り当てるとそれっぽいかもしれません。

vnoremap <silent> <C-a> :ContinuousNumber <C-a><CR>
vnoremap <silent> <C-x> :ContinuousNumber <C-x><CR>


(注意)
連番処理に を使用しているため、 04 のように最初が0で始まる数値は8進数として扱われます。
8進数処理が必要でない場合は nrformatsから8進数を認識しないよう設定すると良いかもしれません。

set nrformats-=octal