*usr_32.txt*	For Vim バージョン 9.1.  Last change: 2025 Nov 09


		     VIM ユーザーマニュアル	by Bram Moolenaar


			      undo ツリー


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

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

次章: |usr_40.txt|  新しいコマンドを作る
前章: |usr_31.txt|  GUI の活用
目次: |usr_toc.txt|

==============================================================================
*32.1*	ファイル保存時への undo

いくつかの変更を加えた後で、やっぱり最後にファイルを保存したときの状態に戻りた
いなと思うようなことがときどきあります。そんなときは次のコマンドを使います: >

	:earlier 1f

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

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

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

	:later 1f

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

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

==============================================================================
*32.2*	変更の番号付け

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

"one" というテキストから始めましょう。最初に " too" を追加します。次に too の
一つ目の 'o' を 'w' に変更します。これで、二つの変更 (番号 1、2) と、テキスト
の三つの状態ができました。

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

一つだけ変更を undo して "one too" の状態に戻り、"one" を "me" に変更します。
すると、undo ツリーに枝が作成されます。

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

この状態で |u| コマンドを使って undo してみてください。二回 undo すると "one"
に戻ります。|CTRL-R| で redo すると "one too" になります。もう一度 |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}

==============================================================================
*32.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+| にカウント指定を付けると実行回数を指定できます。

==============================================================================
*32.4*	タイムトラベル

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

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

	:undolist
<	number changes  time ~
	     3       2  16 seconds ago
	     4       3  5 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()

==============================================================================

次章: |usr_40.txt|  新しいコマンドを作る

Copyright: see |manual-copyright|  vim:tw=78:ts=8:noet:ft=help:norl:
