bonar note

京都のエンジニア bonar の技術的なことや技術的でない日常のブログです。

recording機能で単純作業を自動化する

例えば、以下のようなCSV形式のデータがあるとします。

tom,172cm,65kg
john,166cm,98kg taro,180cm,55kg
ken,190cm,88kg
bill,171ck,60kg
steve,169cm,80kg

名前、身長、体重、みたいな並びになっているのですが、この身長と体重の項目の並びを逆にしたい、みたいな場合にちょっとめんどうです。


普通にvimで編集する場合は以下のような操作になると思います。

f,vf,hd$p

手順的には

  • f, // 最初のカンマまで移動
  • vf,hd // 1.の位置から次のカンマの手前までを切り取り
  • $p // 行の最後に2.で切り取った文字列をペースト

といった感じですね。


こうすれば出来るにはできるのですが、これをすべての行でやるのはかなり面倒です。5000行とかあるともうげんなりって感じですね。


vimはこういった単純な作業を登録して簡単に実行することができます。これがrecordingです。


具体的には以下のようにします。(ESCで編集モードに入ってから入力)

qaf,vf,hd$pjq

先ほどの入力をqaとjqで囲んだ形になっています。qというのがrecordingを始めるサインで、次に編集モードでqが入力されるまでの操作が丸ごと記録されます。qの後のaという文字は記録した操作を保存するレジスタ(文字列を保存する領域)名で、ここにはa〜zまでの任意のアルファベットを割り当てることができます。

最後にj(下の行に移動)を入れているのは、連続実行した際に次々下の行を実行していくためでです。


記録した操作を「再生」するには、操作を適用したい行の先頭にカーソルを合わせて

@a

と入力します。a先ほどのレジスタ名(任意のアルファベット)です。例えば、

john,166cm,98kg

の行で@aを押すと、

john,98kg,166cm

と置換され、カーソルが一段下に移動しました。そこでさらに@aを押すと、taroの行も操作が適用されさらにカーソルが一段したに移動します。これを繰り返すことでどこまでもこの操作を繰り返すことができます。

たとえ対象になる行が10000行あったとしても、

10000@a

と入力するだけで一発で変換できます!便利!


こんな便利なrecordingですが、実はなんてことはないレジスタに保存してある文字列をそのまま入力するだけの機能とも言えます。例えば以下のようにaに保存された内容を表示してみます。

"ap

するとカーソル位置に以下のように表示されます。

qaf,vf,hd$pjq

自分が入力したものが素直に文字列に格納されているだけのようです。vimはこれを先頭から順番に入力していってるだけんですね。ただの文字列なので、ファイルに保存して後で再利用したりすることも当然できます。
以下のように行ごとレジスタに取り込んでしまえば、また@+レジスタ名で操作を再現できます。

"ayy

(aは任意のレジスタ名)

なんか知ってる人には当たり前のことを偉そうに語ってほんとすいません。。
vimはこの機能を使うだけでかなり生産性があがると思うので、まだ試した事のない方は是非!

恐縮です!