株式会社CINC 開発本部(旧:開発部) エンジニアブログ

開発部→開発本部!!ビッグデータ取得/分析・自然言語処理・人工知能(AI)を用いた開発を軸に、マーケティングソリューションの開発や、DX推進を行っている、株式会社CINCの開発本部です。

Vimエディタで、複数行に連番を追加する方法

Vimエディタで、複数行に連番を追加する方法 こんにちは、株式会社CINC開発本部です。

普段よりテキストデータに対するちょっとした編集時にはvimを利用しているのですが、先日対象行に対して連番を設定したいという機会がありました。 vimの標準の機能を利用して、連番を振る方法について説明します。

方法

  1. 連番を振りたい範囲の先頭行でマークaを設定(maコマンド)
  2. 連番を振りたい範囲の終端行でマークbを設定(mbコマンド)
  3. 次のコマンドを実行:
:'a,'bs/^/\=printf("[%d]:", line(".") - line("'a") + 1)/g

仕組みの説明

ポイント1: 置換式の評価

Vimの置換コマンドでは、置換文字列が \= で始まる場合、その後の内容は「式」として評価されます。これにより、Vimの関数を利用することができます。

ポイント2: 使用している関数

このコマンドでは主に2つの関数を使用しています

関数名説明
line()カーソルやマークの行番号を取得する
printf()書式付き文字列を整形する

参考 https://vim-jp.org/vimdoc-ja/usr_41.html#function-list

ポイント3: 行番号の計算

line(".") - line("'a") + 1 の部分を分解すると

  • line(".") - 現在処理中の行番号
  • line("'a") - マークaを付けた行(先頭行)の行番号
  • + 1 - 0始まりではなく1始まりにするための調整

つまり、先頭行からの相対的な行数に1を加えることで、1から始まる連番を生成しています。

使用例

例えば次のようなテキストがある場合

リンゴ # ここでmaでマークする
バナナ
オレンジ
メロン
グレープ # ここでmbでマークする

として、先頭行と終端行でそれぞれマークa、マークbを設定し、コマンドモードで

:'a,'bs/^/\=printf("[%d]:", line(".") - line("'a") + 1)/g

とすることで、マークの範囲内の先頭に下記のような形で、1から連番で番号を付与することが可能です。

[1]:リンゴ
[2]:バナナ
[3]:オレンジ
[4]:メロン
[5]:グレープ

まとめ

Vimの標準機能でできる、便利コマンドのご紹介でした。 関数を利用することで、より複雑なことも簡略化されますね。

今後も色々な小技を共有していけたらと思います!