こんにちは、株式会社CINC開発本部です。
普段よりテキストデータに対するちょっとした編集時にはvimを利用しているのですが、先日対象行に対して連番を設定したいという機会がありました。 vimの標準の機能を利用して、連番を振る方法について説明します。
方法
- 連番を振りたい範囲の先頭行でマークaを設定(maコマンド)
- 連番を振りたい範囲の終端行でマークbを設定(mbコマンド)
- 次のコマンドを実行:
:'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の標準機能でできる、便利コマンドのご紹介でした。 関数を利用することで、より複雑なことも簡略化されますね。
今後も色々な小技を共有していけたらと思います!