vimで元に戻す履歴を破棄するにはどうすればよいですか?


23

Vimで元に戻すのは良いことです。ただし、既知の良い時点で、元に戻す履歴を消去したい場合があります。これを使用uして、個々の変更を元に戻しますが、特定の時点までしか元に戻せません。(たとえば、これは私が最後にコミットしたときかもしれません。)

これを実現する1つの方法は、ファイルを閉じて再度開くことです。その時点で、元に戻す履歴がクリーンになります。しかし、それは面倒です。

過去に、私はこれを達成しました:edit!。ただし、Vim 7.3では、取り消し履歴は破棄されません。

ファイルを閉じる以外に、これを行う別の方法はありますか?


あなたは実際にあなたの最後のコミット時のファイルの状態を復元したいだけですか?あなたは、本質的に同じようなものに「U」キーを再マッピングしたいですgit checkout -f filehg rollback file
アキラ

@akira-いいえ、u個々の変更を元に戻すために使用できるようにしたいのですが、最後にコミットした時点を過ぎてはいけません。まるで、私がコミットするたびに、ファイルを閉じて再度開きました。これは、:edit!以前は何をしていたかです-ファイルを閉じて再度開くようなものでした。これはコミットポイントに結び付けられる必要はありません。それは私が最も頻繁にそれを欲する時です。
ネイサンロング

ああ、それは問題をより明確にします。質問を少し変更する必要があります。
アキラ

回答:


11
:set undoreload=0 | edit

あなたが求めていることをすべきです。


1
ハ!その機能をオフにしてください。:)なぜこれに気づくのにそんなに時間がかかったのか分かりません。
ネイサンロング


6

ブノワの機能は私には機能しませんでしたが、vimマニュアルで似たようなものを見つけました。

http://www.polarhome.com/vim/manual/v73/undo.html#undo-remarks

私はvimrcに追加した関数にそれを平手打ちし、vim 7.3でうまく動作しているようです:

" A function to clear the undo history
function! <SID>ForgetUndo()
    let old_undolevels = &undolevels
    set undolevels=-1
    exe "normal a \<BS>\<Esc>"
    let &undolevels = old_undolevels
    unlet old_undolevels
endfunction
command -nargs=0 ClearUndo call <SID>ForgetUndo()

これはで使用できます:ClearUndo


1
Gundoプラグインと元に戻すファイルのリロードで正常に動作します。これは私にとって非常に便利です。ただし、次の2つの点を変更しました。通常の編集コマンド(7.4で編集履歴が残るようですが)の代わりに、単に編集を使用します。(および、元に戻す履歴を消去する前に常に書き込みます)。一部の内部リストは適切に更新されていないようですので、Gundoプラグインでこれを使用する場合は、追加の編集を行ってください!関数の最後で、後でエラーが発生するのを防ぎます。
PlasmaHH

@PlasmaHHあなたが何を変更したのか理解できなかったので、元に戻す履歴をクリアするための機能を投稿してください... ありがとう
ベン14

5

多分:

:let old_ul=&ul
:set ul=-1
:let &ul=old_ul
:unlet old_ul

'ul'はのエイリアスです'undolevels')。


これは動作します!今、私は単一のコマンドにそれをさせようとしています-できれば:edit!。スタートとして、私はあなたが記載されているコマンドを持つ関数と呼ばれるClearUndos()を作りましたが、それを呼び出すと、何もするようではありません、個別にコマンドを実行することはないのに対し、...
ネイサン・ロング

3
:command -nargs=0 Reset let old_ul=&ul | set ul=-1 | e! | let &ul = old_ul | unlet old_ul
ブノワ

それは関数の内容であることを意味していますか?それは私のために働いていませんが、多分私は誤解した。また、おそらくこれを独自の答えに移動しますか?
ネイサンロング

|コマンドコンテンツにraw を入れることはできないかもしれません。次に、回答で指定したことを実行する関数を作成し、コマンドをに設定しcall thefunction()ます。
ブノワ

3

"元に戻す履歴をクリア(:wで元に戻すファイルをクリアします)
command! -bar UndoClear exe "set ul=-1 | m-1 | let &ul=" . &ul

  • 'undolevels'を-1に設定すると、元に戻す情報はすぐにクリアされm-1ません。これは次の変更、つまり実際にテキストを変更しないときに発生します。
  • 'undofile'オンの場合:w、元に戻すファイルをクリアするため、またはのようなチェーンUndoClear|w

1

スクリプト内:

function! <SID>ForgetUndo
     let old_ul = &ul
     set ul=-1
     let &ul = old_ul
     unlet old_ul
endfunction
command -nargs=0 Reset call <SID>ForgetUndo()

それを使用:Resetして呼び出します。


関数定義行の最後には()が必要です。
ネイサンロング

これは奇妙です-これらのコマンドを個別に実行すると正常に機能し、関数全体で値をエコーすると、それらが適切に設定および設定解除されていることがわかります。ただし、関数を実行しても元に戻す履歴はリセットされません。その後、何度も元に戻すことができます。たぶんset ul=コマンドは、スクリプトが終了するまで、ローカル変数に影響を与え、そして私たちは、スクリプトが終了する前に戻ってそれを変更するので、それは環境に影響を与えることはありませんか?この機能をテストし、機能させましたか?つまり、私のセットアップについて何かおかしいことがありますか?
ネイサンロング
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.