nyancat.vimの裏話

勢いだけで書いたnyancat.vimの、裏話を解説してみます。

この記事はVim Advent Calendar 2011 の9日目のエントリーです。

@mattn_jpさんにそそのかされて勢いだけでnyancat.vimを書きました。その時のVimを活用した裏話を書きます。時間があったらソースコードも読んでみると面白いかもです。これらのテクニックを身につければあなたもVimでアニメーションとかエロゲとか作れちゃうかも。

裏話

このnyancat.vimは以前に書いたmaze3d.vimをベースにしており、ちょっと面倒だったのは二点だけです。

  • nyancatのデータどうするよ?
  • 色、具体的には何色よ?

後者は資料画像があり、GIMPのスポイトツールでポチポチと吸い出せば良かったので、単に面倒なだけでした。

問題は前者で、自前でドットパターンを作ることも考えたのですが、この記事にあったPerlのソースを見たら良さ気なテキストデータがありましたので、流用することにし、データ部分をそのままクリップボード経由でコピーしてVimのバッファに貼り付けました。

:new<CR>
"*p

カーソルをちょちょいと動かすと1フレームあたり64行でできていることがわかります。そしてフレーム間には1行の空白が入っていました。これは好都合。

00 (行番号確認)
}  (行番号確認)
G  (行番号確認) 

maze3d.vimは1フレームあたり20行でしたがcmdheight=1 laststatus=0にすることで22行まで拡張できることがわかっており、またデータを見るかぎりどうやらネコの絵だけならば22行で十分で、かつ64行のうち前後の21行ずつを削れば良いことがわかりました(64-21*2 = 22)。ココでその加工にマクロが使えます。こうやって第1フレームを必要なサイズに加工しつつ、マクロを記録しました。

ggdd (一番先頭の空行を削除しつつ、第1フレームの先頭行へ移動)
qa   (マクロ記録開始: 記録先a)
  21dd (前にある21行を削除)
  22j  (残す22行をスキップ)
  21dd (後ろにある21行を削除)
  j    (次のフレームの先頭行へ移動)
q    (マクロ記録終了) 

ここでマクロがうまく動くか確認します。

@a (aに記録されたマクロを再生)

仮にダメならundoしてマクロの記録からやり直すところですが、大丈夫でした。あとは(最後に実行した)マクロの実行を繰り返すだけ。

@@ @@ @@ @@ @@ .. @@ (合計10回)

行番号を確認した時に全部で12フレームあることはわかっておりマクロの記録と確認で2フレーム処理していたので、

10@@

でもよかったのですが、なんとなく中身を確認しながらやりたかったので、最後まで連打しました。

で、次にVimに食わせるときには文字列の配列の配列にしたかったので、データに以下の加工を施しました。

:%s/^.\+/\\ "&",/ (空ではない行を文字列配列になるように整形)
:%s/^$/\\], [/    (空行を配列の配列になるように整形)

で、あとはこれをスクリプト本体に貼り付けて整形しただけ。

:%y          (現在のバッファをヤンク)
<C-w><C-w>p  (スクリプトのバッファに移動し貼付け)
{V}=         (貼りつけた部分のインデントを整形)

あらかじめスクリプト本体にはこんなん書いてました。カーソルは “patterns” の上にありました。

                     ({}で飛びやすいように空行がある)
let s:patterns = [
    \] 
                     ({}で飛びやすいように空行がある)   

あとは先頭と最後のゴミを修正しました。

jjf]2x        (先頭の余計な "\], [" を "\[" に変える)
}kkf,C,<ESC>  (末尾の余計な "\], [" を "\]," に変える)

これでデータの準備は完了です。ここまで数分の仕事です。

まとめ

この話の重要な点は、上記の手順が私にとってはまったく悩むことなく、試行錯誤することも一切なく、よどみなく実行されるという点です。キータイプ数で言えばやや無駄なところはありますが、このようなスポットで発生する不定形なタスクであっても、Vimに習熟をすることで本来持っている機能だけを活用してスムーズに遂行できてしまいます。ちなみに作業時はどうタイプするのかは意識していません。この記事を書き起こすために意識しながら作業を再現して、やっと書きだせるという程度なのです。

以上、Vim廃人の作業過程の紹介でした。