Next: , Previous: , Up: 目次   [Index]


undo ツリー

*usr_32.txt*	For Vim バージョン 8.1.  Last change: 2010 Jul 20

		     VIM USER MANUAL - by Bram Moolenaar

			      undo ツリー

Vim にはマルチレベルの undo 機能があります。變更を undo してから新しい變更を加へると、undo ツリーに枝が作成されます。このテキストでは、枝を移動する方法を說明します。

|32.1|ファイル保存時への undo
|32.2|變更の番號付け
|32.3|ツリーを飛び回る
|32.4|タイムトラベル

ファイル保存時への undo

いくつかの變更を加へた後で、やつぱり最後にファイルを保存したときの狀態に戾りたいなと思ふやうなことがときどきあります。そんなときは次のコマンドを使ひます:

:earlier 1f

"f" は "file" を意味します。

このコマンドを繰り返し實行してさらに過去に戾ることができます。あるいは、1 より大きなカウント指定をすればもつと素早く過去に戾れます。

戾り過ぎてしまつたときは次のコマンドで進むことができます:

:later 1f

Note:
このコマンドは時閒を基準にして移動します。これは undo した後で何か變更を加へてゐた場合に重要になつてきます。それについては次の節で說明します。

Note:
ここではテキストの保存の話をしてゐます。undo 情報のファイルへの保存については |undo-persistence| を參照してください。

變更の番號付け

セクション |02.5| では一本道の undo/redo について說明しましたが、實は、undo/redo は分岐することができます。變更を undo してから新しい變更を加へると、新しい變更が undo ツリーの枝になります。

"one" といふテキストから始めませう。最初に " too" を追加します。次に ‘too’ の 1 つ目の ’o’ を ’w’ に變更します。これで、2 つの變更 (番號 1、2) と、テキストの 3 つの狀態ができました。

  one
   |
change 1
   |
one too
   |
change 2
   |
one two

1 つだけ變更を undo して "one too" の狀態に戾り、"one" を "me" に變更します。すると、undo ツリーに枝が作成されます。

       one
        |
     change 1
        |
     one too
     /     \
change 2  change 3
   |         |
one two    me too

この狀態で |u| コマンドを使つて undo してみてください。2 回 undo すると "one" に戾ります。|CTRL-R| で redo すると "one too" になります。もう 1 度 |CTRL-R| を實行すると "me too" になります。このやうに、undo/redo を實行すると、最後に使はれた枝を上下に移動できます。

重要なのは變更が作成される順番です。undo ツリーにおいては、undo と redo は變更とはみなされません。それぞれの變更の後にはテキストの新しい狀態があります。

Note:
變更にだけ番號が付きます。上圖のツリーに示されてゐる "テキスト" の部分には番號が付きません。テキストは、その上の變更番號によつて參照されます。ただし、ツリーを上に移動したときなどは、下の變更番號によつて參照されます (どの變更が undo されたかわかるやうに)。

{譯注: 例へば上圖の "one too" から undo/redo したときのメッセージ:

undo したとき:1 change; before #1<- 下の番號が使はれる
redo したとき:1 change; after #3

}

ツリーを飛び回る

さて、"one two" の狀態を得るにはどうすればいいでせうか。次のコマンドを使ひます:

:undo 2

テキストが "one two" (change 2 の下) になります。|:undo| コマンドを使ふと、指定した變更の下にジャンプできます。

新しい變更を加へてみませう。"one" を "not" に變更します:

       one
        |
     change 1
        |
     one too
     /     \
change 2  change 3
   |         |
one two    me too
   |
change 4
   |
not two

何か考へが變はつて "me too" に戾りたくなつた場合は、|g-| コマンドを使ひます。このコマンドは時閒を基準にして戾ります。ツリーを上下に移動するのではなく、直前の變更に移動します。

|g-| を繰り返し實行すると、テキストは次のやうに變化します:

me too
one two
one too
one

|g+| を使へば時閒を進めることができます:

one
one too
one two
me too
not two

ジャンプしたい變更番號が分かつてゐるときには |:undo| が便利です。番號がよく分からないときには |g-| と |g+| が便利です。

|g-| と |g+| にカウント指定を付けると實行回數を指定できます。

タイムトラベル

しばらくテキストを編輯すると、ツリーは大きく成長します。そのとき、數分前のテキストに戾りたいと思ふことがあるかもしれません。

undo ツリーにどのやうな枝があるかを確認するには次のコマンドを使ひます:

:undolist
numberchangestime
3216 seconds ago
435 seconds ago

枝に付いてゐる葉の數と、變更された時閒が表示されます。今、change 4 の下 ("not two") にゐるとして、10 秒前に戾るには次のやうにします:

:earlier 10s

指定した時閒だけ戾り、ツリーの特定の位置へ移動できます。|:earlier| コマンドの引數は "m" で分、"h" で時閒、"d" で日を指定することもできます。すべての變更を元に戾したい場合は大きな値を指定してください:

:earlier 100d

時閒を進めるには |:later| コマンドを使ひます:

:later 1m

|:earlier| と同樣に、"s", "m", "h" で單位を指定します。

undo 情報の詳細を見たい、觸りたい、といふ場合は |undotree()| 函數を使つてください。函數が何を返すかは次のコマンドで確認できます:

:echo undotree()

Next: , Previous: , Up: 目次   [Index]