この記事は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廃人の作業過程の紹介でした。