心魅 - cocoromi -

半角スペース時々全角

知っているといざという時に役立つ、ちょっと特殊なundo、redo

追記

vimのバージョン
7.0.237


たとえば

1.この状態から
f:id:umezo:20090429155226p:image


2.ココまで編集して
f:id:umezo:20090429155221p:image


3.「あれ、これちがくね?」って、undoして
さっきのところまで戻る
f:id:umezo:20090429155226p:image


4.んで、
また、書き直し初めたんだけど。
f:id:umezo:20090429155219p:image


5.「やっぱさっきのであってんじゃね!?」
で、undoしても・・・
f:id:umezo:20090429155226p:image


2に戻りたいのに戻れない!?
っていうこと、時々ないですか?

vimならg+,g-コマンドで戻れますよと。

undotree

vimはundotreeという概念があり、編集履歴をツリー状に管理しています。
通常のundo、redoでは各ノードの最新の枝だけしか行き来出来ませんが、
任意のノードに移動する手段が用意されています。


そのコマンドがg-とg+です。


たとえばさっきの、ここからg-を押すと
f:id:umezo:20090429155219p:image


見事この状態にもどれます。
f:id:umezo:20090429160152p:image

解説

どういうことが起きてるのかと言うと下の図のようなことが起きてます。

数字は冒頭の図の番号、通常のundo、redoでは赤のラインを行ったり来たりするだけで、2の状態には戻れません。
g-コマンドでは、現在のノードの次に新しいノードに移動するために、2の状態に戻すことが出来ます。
f:id:umezo:20090429161526p:image

関連コマンド

undotree関連のコマンドは以下です。

  • g-
  • g+
  • :undolist
  • :undo NODE_NUMBER

編集履歴が複雑になったときは:undolistで、ノードを確認し:undo NODE_NUMBERで目的のノードへ移動します。
f:id:umezo:20090429161900p:image
    ↓
f:id:umezo:20090429162029p:image
    ↓
f:id:umezo:20090429162148p:image

追記:マニュアルの場所

このことはヘルプのUndo and Redo(undo.txt)かThe undo tree(usr_32.txt)を見ると書いてあります。
:help undo-treeとかでもだいたい同じ場所に飛びます。

まとめ

undo,redoで困ったらg-、g+コマンドを試してみよう