undoとかredoとかtreeとか

計算機史上最大の発明 undo/redo。ことコンピュータの中のことであれば、これさえあれば、いつでも人生をやり直せます。あんな自分にもこんな自分にも。
もちろん計算機資源にも限りがあるので、あらゆる時点に戻れるわけでは無く、いくつかのセーブポイントに戻れるってだけですが、それでもあるのと無いのとでは、次の一歩を踏み出す勇気の質と量が全く違ったものになります。
#おおげさです。その通りです
vimにだって UNDO/REDOがあります。完璧です。強力です。

事件が!

とりあえず外形だけ書いてみたとします。

#(1)
boundlist.each {|bound_field|
}

visualize frame
~                                                                                           
~                                                                                           
~                                                                                           

ここでさあ中はどうしようかなーとかあまり考えずに

#(3)
boundlist.each {|bound_field|
    dx += get_value_from(bound_field.x)
    dy += get_value_from(bound_field.y)
    update_on frame, dx, dy
}

visualize frame
~                                                                                           
~                                                                                           
~                                                                                           

とか書いてみたけど、ここで邪魔が入ります。なんと、お釜を洗えとな(妙に生々しいです。どういうことなんでしょう)。アレクサンダー大王の時代から最先端のコンピュータまで、人類の発展の歴史にはこのinterrupt!(割込み)が大きく起因しており、全体主義スループットを打倒する、TA(応答時間)ムーブメントとして・・・・・そんなことはどうでもよろしい。

で、もどってきたころには頭の中がキレイにGCされてます。マークする前にハンドラに飛んで行っているので、必要なものまでまとめてパージされてしまうのが我々ダメ人間の特徴です。
原始人に戻った僕が第一声「なんだこのバカコード!!!」 でもあわててはいけません。僕はvimという大船、いやタイムマシーンに乗っているのです。'u'で元通り。
で、何事もなかったかのように

#(4)
boundlist.each {|bound_field|
    dx = something_bad
    dy = something_more_bad
    
}

visualize frame
~                                                                                           
~                                                                                           
~                                                                                           

と、上書き生成。おいおい。直後、さっきまでの理性を取り戻します。「しまった!!ハマった」 そうです。'u'してしまってから編集してしまうと、いくら'C-r'でredoしても過去の分岐の反対側にはいけないのです。

大丈夫ですよー

もうだめー。いやいやそんなことはありません。なんといってもvimですよ。そんなところに弱点があるわけ無いじゃないですか。
'u'の後に編集をする、ということは履歴ツリーの分岐をしてツリーを形成しているのと同じなわけですね。
#まさにブランチを切っている
そう考えると現在のツリーは

 Original  --->  (1)外形  -->  (2)最初の正しいコード(途中) -->  (3)最初の正しいコード(完)
              |
              +-------> (4) バカなコード

で、これの(0)->(1)->(4) ループが形成されてしまっていると。
vimは編集コマンド毎のこのツリー接点(text state)を覚えています。で、それをつかって、:undo でその状態に移ることが出来るのです。

:undo 3

でOK! g-, g+ でこのtext state番号単位でundo/redoすることもできます。
また, :earlier, :later を使うと「何秒後!」とかに戻ることも出来ます。vimで'u'するとたまに「#?秒経過しています」とか出ますが、こういうことだったのですね。詳細は :help undo-b にて

けどさ、、、

このツリーがどうなってるかわかんねーよ、、、という貴方もこれで安心

Gundo.vim http://www.vim.org/scripts/script.php?script_id=3304

以下からとってこれます。

 % hg clone http://bitbucket.org/sjl/gundo.vim

これを .vimの上に上書きして

:GundoToggle

またはなんかにバインドしておけば

こんなツリー表示が出ます。わーすご。

結論

いつだってやり直すことはできるんだ! 勇気を持っていこう!