VIMの取り消しツリーはどのように使用されますか?


132

この答えは言う:

Vimの元に戻す/やり直しシステムは無敵です。Vimはスタックではなく取り消しツリーを使用するため、何かを入力して、元に戻したり、何かを入力したりしても、最初に入力したものを元に戻すことができます。他のほとんどすべてのプログラムでは、最初に入力したものの履歴はこの状況では失われます。

これは私が聞いた最初のものです。ツリーに沿ってバックトラックするにはどうすればよいですか?


1
嫉妬深いEmacsユーザーは、undo-tree-modeについて知りたいかもしれません。
アーロンミラー

回答:


142

も参照してください:h undo-redo。すべてのコマンドとその使用法がリストされています。

アンドゥツリーをトラバースするには2つの方法があります。1つは、「時間を遡る」ことです。 g+そしてg-、それはアンドゥ枝の間で任意にジャンプすることができますので、少し混乱することができ、時系列または逆年代順にツリー(内のすべてのノードを通過しますが、あなたがしなければg-十分な長さ、あなたは常にあなたが行く必要がある取得します最終的に)。 またはのような時間記述子:earlier:later受け取ります。繰り返しますが、これにより、取り消しブランチ間を任意にジャンプできます。7m1h

もう1つの方法は、:undo nwhere nがアクションの番号であることを使用して、ツリー内の特定のノードにジャンプすることです。(テキストの追加、削除、置換などのすべてのアクションには、実行時に順番に番号が付けられます。)を使用して、取り消しツリーのリーフでアクションの数を調べることができます:undolist。これにより、ブランチ間を簡単にジャンプできます。次に、uおよびCtrl-Rを使用して、そのブランチを上下に移動できます。

Vimのヘルプにいくつかの良い例があります。これがどのように機能するかを理解する最良の方法は、少し遊んでみることです。


43
ブランチをマージできますか?(冗談です)
he_the_great

40
ちょっと。ルックアップ:h undojoin
ポッド

23
Vimはとても素晴らしいので、私たちはそれがどれほど素晴らしいかについて冗談を言う方法も実装しています!
andyortlieb

4
このundoツリーの使い方はわかりませんでしたが、いつか私の命を救うことができると思いました。さて、その日が来ました。ありがとう!!
ndvo 2013年

1
@Podブランチとundojoinは関係ないようです。実際、次のヘルプセクションは、「上記では、元に戻す/やり直しの1行のみを説明しましたが、分岐することも可能です」と述べています。私がundojoin見ないだけのブランチで使用する方法はありますか?
カイルストランド

70

私はパーティーに少し遅れましたが、Vimの元に戻すツリー視覚化プラグインを作成したことを述べたいと思いました:http : //bitbucket.org/sjl/gundo.vim/

個人的には、このようにツリーをグラフ化することが、私が理解できる唯一の方法であることがわかりました。


より最新のgitリポジトリはgithub.com/sjl/gundo.vimにあります。vim-plugを使用すると、プラグインを(Plug 'sjl/gundo.vim'次に、バインドしたいキーシーケンスにnnoremap <F5> :GundoToggle<CR>置き換え<F5>て)インストールできます
ewen-lbh


16

vimを使用している場合は、次のコマンドを使用して、元に戻すツリーを移動できます。

  • u:(元に戻す)元に戻すツリーに戻る
  • Ctrl+R:(やり直し)元に戻すツリーで前に移動

ドキュメントを時間的に前後に移動する他の方法:

  • :earlier 15m:15分前に戻ります
  • :later 15m:15分前に移動

2
この回答では、1つのブランチを前後に移動する方法についてのみ説明します。ブランチ間を移動する方法ではありません。
Jonathan Hartley

これは、すべてのブランチを移動し、すべてのポイントを時間順にソートします。@BrianCarperの回答を参照してください。
Holloway

@JonathanHartley、使用earlierlaterていてブランチ間を移動していない場合。ほとんどの人は、自分が作成したさまざまなブランチを本当に気にしたり覚えたりしないと思います。しかし、時間を遡りたいだけです。ブランチを作成して名前を付けたい場合はgit、バージョン管理システムの方が適しています。
alpha_989

@ alpha_989バージョン管理に関するコメントは意味がありません。バージョン管理は、ディスク上の名前付きファイルの状態用です。ここでは、メモリ内の単なるデータ構造であるVimのundoツリーについて説明します。どちらも「ブランチ」という言葉を使用していますが、同じ意味ではありません。
ジョナサンハートレイ

以前/後期に指摘した皆さんのおかげで、ブランチ間を移動します!
ジョナサンハートレイ

9

この質問に回答したことは承知していますが、例を追加すると思います。

新しいファイルを作成し、次のように入力します。

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+は何もしません(葉っぱにいます)。押すとg-削除されます、「古い」(あなたが最初のアンドゥツリーを横断している)。あなたが『古い』削除する場合はそれがあるg-とプレスはg+再び、「古い」はやり直しになります。

入力した場合

:u 3

2番目のundoブランチの葉にジャンプすると、次のようになります。

this is a new line


3

gundo.vimを使用してほかに、私が言及したいg+g-


3

パッケージ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 

ここに画像の説明を入力してください

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.