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
結論
いつだってやり直すことはできるんだ! 勇気を持っていこう!