vimでmarkdownの表を作成する一例

社内で利用しているBacklogなどの課題管理システムに簡単な情報をテキストベースで載せたい場合等に、markdownで表を作成するケースがあります。
markdownでの表を作成するツールとしては、スプレッドシートを使用する
https://workspace.google.com/u/0/marketplace/app/generatemarkdowntable/23306117760?hl=ja&pann=sheets_addon_widget
のように便利なツールがあります。

一方、不具合解析を行う場合などはログからポイントとなりそうな箇所を表として抽出したい場合がありますが、出力元のプログラムによってログのフォーマットが異なるため、個々のログに対して整形が必要となります。
スクリプトを組めば自動化はできますが、ログごとにスクリプトを作成するのは若干手間になります。
また、エディタでログを見つつ、ポイントとなりそうな箇所を摘まみだして表にできると便利です。

本ブログでは、vimを使用してログからデータを抽出してmarkdownの表を作成する例についてご紹介したいと思います。

対象のログ

具体的な例として、

のようなログから以下のように、targetを含む行からtypeと値を取り出してmarkdownの表として作成します。

手順

まずはログの構成を見てみます。
targetを含む行はカンマ区切りとなっており、
例えば


1列目(XXX):ラベル. 表には含めない
2列目(target):表に含める識別子
3列目(3):種別
4列目(y):値
の構成となっています。

以下の行もtargetを含みますが、”target x”となっているので、表からは除外することとします。

不要な行の削除

まずはtargetを含まない行やtarget xを含む行等の不要な行を取り除くために以下を実行します。

:g!/pattern/cmdはpatternにヒットしない行に対してcmdを実行しますので、上記コマンドは、
“,target,”を含まない行に対してノーマルモードでdd(行ごと削除)するという処理になります。
(:g/pattern/cmdであれば、patternにヒットする行に対してcmdを実行)

実行後は以下のようになります。

 

種別と値の抽出

次に表に必要な種別と値を取り出します。
正規表現で必要な部分のみ抽出します。

以下のようになります。

 

番号の付与

上記表ではnoが付与されていない状態です。
連番を作成する必要がありますが、スクリプトは組みたくありません。
そこでvimのマクロ機能を使います。
vimのマクロ機能は任意のキー入力を記憶しておき、再度実行するための機能です。

方針としては、
1. ベースとなる番号をコピー
2. 1を次の行にペースト
3. 2をインクリメント
となります。

まずはとっかかりとなる部分をとして、1行目に”|1″を追加します。
ここで追加した”|1″をベースとして、上記のようにコピー、ペースト、インクリメントをマクロで行えるようにします。

マクロの記録、停止はqコマンドを使用します。
マクロはvim内部に持っているレジスタに記録されるので、開始時は保存先のレジスタを指定する必要があります。
ここではaレジスタに記録することとします。
以下の例では指定がない限りコマンド終了時にエンター入力は必要ありません。

まずは表の先頭1行目の1列目にカーソルを置いた状態で

を実行します。
次に

を押下してビジュアルモードに遷移し

を入力します。
これは、次の表のカラム区切りの”|”(OR記号)までカーソルを移動させ(fl)、1つカーソルを戻した上で(h)、選択箇所をコピー(y)となります。
これにより、1. ベースとなる番号のコピーの完了です。
次に

(最後の”l”は小文字のエルとなります)
を入力した後に

を入力すると、以下のようなテキストが生成され、カーソルは2行目の先頭にある状態となります。
これは、次の行のカーソル前にコピーした内容をペースト(jP)したうえで、カーソルを1つ右に進め(l)、
カーソル下の値をインクリメント(Ctrl-A)し、最後に行の先頭に戻っています(0)。

ここまででコピー、ペースト、インクリメントが実行されており、マクロにもそれらの手順が記憶された状態となっています。
ここで

を実行してマクロを停止します。
この時点でaレジスタを見てみると、

 
となっており、操作が記録されていることが分かります。
(Ctrlは^と表示されます。また、<80>aはvimが自動で付与しています)

記録したマクロは@レジスタ名で実行できます。

でaレジスタにマクロを記録しているので、

として保存したマクロを実行してみます。
すると、以下のようになると思います。

また、マクロ実行はカウンタを使用して一度に複数回実行することも可能なので、上記の状態から

を実行すると、以下のように4行目以降すべてに番号が付与されます。(保存したマクロを7回実行)

最後にヘッダ

を付与して完了となります。

一連の流れは以下の動画のようになります。

この例のように小さなデータではあまり恩恵はないかもしれませんが、行数が多い場合は作業はかなり楽になると思います。
vimでmarkdownを作成するプラグインとしては
https://github.com/dhruvasagar/vim-table-mode
のような便利なものもありますので、組み合わせるとより便利に使えると思います。
また、マクロには任意のキー入力を保存できるので、応用することでいろいろな場面で便利だと思います。

本ブログではちょっとした効率化の例としてvimの機能をご紹介しました。
ご参考になれば幸いです。