座敷牢日誌

都落ちした元SEがソフトウェアやネット関連のことを書いています

Vimで行頭に行番号を挿入する方法いくつか

f:id:zashikiro:20140205003013p:plain

:set number で行番号を表示するのではなく、本文の行頭に行番号を挿入したいことが ある。

いろいろやりようがある。知ってるのを整理してみた。

外部コマンドでフィルタする (cat, awk)

外部コマンドでフィルタリングするアプローチは、行番号の挿入に限らず役立つことがけっ こうある。

普段は cat コマンドでやっている。

:%!cat -n

開始番号をコントロールしにくいところがちょっと使いづらい。

awk でも出来る。見栄えはこっちのほうが調整しやすいかも。次のコマンドで右詰め・ スペース埋めした行番号が挿入される。

:%!awk "{ print sprintf(\"\%3s\", NR) \":\", $0 }"

開始する行番号を調整することも一応できる。次のようにすると、「31:」から出力され る。が、こんな使い方はしたくないな。

:%!awk "{ print sprintf(\"\%3s\", NR + 30) \":\", $0 }"

sed を使ってできないこともないらしいが、パイプなしではやりようがなさそうなの で、これは除外。

%!sed =|sed "N;s/\n/: /"

置換でやる (:s)

:%s で始まる置換コマンドで行番号を挿入できる。vimの関数がよくわかるとこっちの ほうが楽かなと思う。置換文字列を \= にすると、以降の文字列は「式」として評価さ れる。

:%s/^/\=line('.') . ': '/

右詰め・スペース埋めの行番号を挿入したければ printf を組み合わせる。

:%s/^/\=printf('%5d', line('.')) . ': '/

範囲指定中に実行しても、開始番号はファイルの行番号になる。選択範囲の1行目を「1:」 とする方法は、ヘルプ見てもよく分からなかった。

プラグインを使う (catn.vim)

行番号を挿入するためのプラグインが存在する。試したことはないです。使用感は上記の 記事で伝わるかも。

まとめ

  • cat -n 一番かんたん。コマンド実行時の整形はあまり融通きかないかも
  • awk は悪くないが、vimコマンドラインからだとエスケープがちょっとめんどうだ
  • 置換とvimの関数の組合せは割といい感じ。vimの関数の勉強にもなりそうだし
  • プラグインを行番号挿入のためだけに導入するのは気が重い

今後も :%!cat -n でやると思う。整形するのはそんなに苦ではないので。

ちなみに外部コマンドを使ったフィルタは、すべて標準入力を渡して処理している。catawksed も シェル上で同じように行えるし、標準入力ではなくファイル名を渡して処理させること もできるので、覚えたことはvim以外でも活用できる。