この答えは言う:
Vimの元に戻す/やり直しシステムは無敵です。何かを入力し、元に戻し、他の何かを入力します。Vimはスタックではなく元に戻るツリーを使用するため、最初に入力したものを元に戻すことができます。他のほとんどすべてのプログラムでは、この状況で最初に入力したものの履歴が失われます。
これは私がこれを聞いた最初のものです。ツリーに沿ってバックトラックするにはどうすればよいですか?
:h undo-redo
すべてのコマンドとその使用法をリストした、 も参照してください。
元に戻るツリーをトラバースするには2つの方法があります。1つは、「過去にさかのぼる」ことです。 g+
ツリー内のすべてのノードを時系列または逆時系列でトラバースしg-
ます(元にされるブランチ間を任意にジャンプできるため、少し混乱する可能性がg-
ありますが、十分な時間があれば、常に必要な場所に移動できます最終的)。 またはのような時間記述子:earlier
を取ります。繰り返しますが、これは元に戻るブランチ間を任意にジャンプできます。:later
7m
1h
もう1つの方法は、アクションの番号である:undo n
whereを使用して、ツリー内の特定のノードにジャンプすることです。n
(すべてのアクション、つまりテキストの追加、削除、置換は、実行時に順番に番号が付けられます。)を使用して、元に戻るツリーの葉のアクションの数を調べることができます:undolist
。これにより、ブランチ間を簡単にジャンプできます。u
次に、とを使用Ctrl-R
してそのブランチを上下に移動できます。
Vimヘルプにはいくつかの良い例があります。これがどのように機能するかを理解するための最良の方法は、少し遊んでみることです。
私はパーティーに少し遅れてい
ますが、Vim用のundoツリー視覚化プラグインを書いたことに言及したいと思いました:
https ://github.com/sjl/gundo.vim
個人的には、このようにツリーをグラフ化することが、それを理解できる唯一の方法であることがわかりました。
このページでは、知っておくべきことをすべて説明しています。
vimを使用している場合は、次を使用して元に戻るツリーをナビゲートできます。
u
:(元に戻す)元に戻すツリーに戻りますCtrl+R
:(やり直し)元に戻るツリーで前に進むドキュメントを時間内に戻したり進めたりする他の方法:
:earlier 15m
:15分前に戻る:later 15m
:時間15分で前に移動しますこの質問に答えられたことは承知していますが、例を追加したいと思いました。
新しいファイルを作成し、次のように入力します。
this is a line
undol
元に戻すツリーが表示されます。この時点では、何も元に戻していない
:undol
number changes when saved
1 1 14:50:36
次にESCを押して、行を次のように変更します。
this is a old line
通常モードに切り替えてu(元に戻す)を押すと、「古い」が削除されます。チェックするundol
と、この時点ではまだブランチが1つしかありません。
ここで、次のように行を変更します。
this is a new line
今:undol
表示されます:
number changes when saved
2 2 87 seconds ago
3 2 3 seconds ago
次のように入力すると、最初のブランチに切り替えることができます
:u 2
これにより、番号2に関連付けられたブランチの最後に移動します。とを使用して、このブランチに沿って移動できg+
ますg-
。この時点でg+
は何もしません(あなたは葉っぱにいます)。「old」を押すg-
と削除されます(最初の元に戻るツリーをトラバースしています)。つまり、「old」を削除してもう一度g-
押すg+
と、「old」がやり直されます。
入力した場合
:u 3
2番目のundoブランチのリーフにジャンプすると、次のように表示されます。
this is a new line
これの多くはここに要約されています:
gundo.vimを使用する以外に、私は言及したいと思いg+
ますg-
パッケージundotreeは純粋なvimscriptで記述されているため、要件はありません。
手遅れになる前にこれをvimrcに追加してください:
set nobackup
set noswapfile
set nowritebackup
set undolevels=10000 " use many levels of undo
set history=10000 " After nocompatible
if has('persistent_undo')
set undodir=$HOME/.vim/undo
set undofile
endif