vimで連番の作成

  • 22
    Like
  • 3
    Comment
More than 1 year has passed since last update.

追記

7.4.754で、g<C-A>が追加されたので簡単に連番が作成できます。

http://vim-jp.org/blog/2015/06/30/visual-ctrl-a-ctrl-x.html

概要

連続した数字を入れる方法です。

期待値

1
2
3
4
5
:                      

手順1

マクロを使用する方法です。

  1. i1<esc> 数字を一つ入れて、
  2. qqyyp<c-a>q マクロを開始
  3. マクロ実行 ( コマンド 100@q)

手順2

スクリプトを使う方法です。
:call setline(1,range(1,100))

手順3

行が存在する場合は、置換で番号を挿入できます。
:%s/^/\=line(".")

おまけ

前の数字を加算するスクリプトを作っておけば便利です。

function! g:set_num() "{{{
" ********************************************************************************
" 連番の作成
" カーソル以降の数字を、前の数字にひとつ加算したものにする ( マイナスは、考慮しない ) 
" ********************************************************************************
"
    " カーソル位置の取得
    let pos = getpos(".")
    let lnum = pos[1]
    let col  = pos[2] - 1

    "=====================
    " 前の行
    "=====================
    let lstr = getline(lnum-1)

    " 数字の取得
    let nums = split(lstr, '\D\+') + [1]

    "=====================
    " 現在の行
    "=====================
    let lstr  = getline(lnum)

    "================================================================================
    " 数字の末尾で分割
    "--------------------------------------------------------------------------------
    " 1 : aaa12(3)4aaaa  : () カーソル位置
    " 2 : aaa1234 , aaaa : カーソルより後ろの数字の末尾で分割
    " 3 : aaa     , aaa  : 数字の削除
    "================================================================================
    let col = match(lstr, '\d\D\|\d$', col) + 1

    " カーソル後に数字がある場合は処理する
    if col > 0
        " 数字の前の文字の取得
        let head = strpart(lstr, 0, col)

        " 数字の数を抽出
        let head_ncnt = len(split(head, '\D\+')) - 1

        " 文の取得
        " 変更する部分の数字は削除する
        let str = [
                    \ substitute(head, '\d\+$','',''),
                    \ get(nums, head_ncnt, 0) + 1,
                    \ strpart(lstr, col ),
                    \ ]

        " 書き込み
        call setline(lnum, join(str,''))

        " カーソル移動
        call cursor(lnum, len(str[0].str[1]))
    endif

endfunction
command! -narg=0 SetNum call g:set_num() 
nnoremap <C-s>   :<C-u>SetNum<CR>|"
"}}}