Geri alma geçmişimi vim'de nasıl atabilirim?


23

Geri alma, Vim'de olması güzel. Ancak bazen, iyi bilinen bir noktada, geri alma tarihimi silmek istiyorum - ubireysel değişiklikleri geri almak için kullanabilmek , ancak yalnızca belirli bir noktaya geri dönmek. (Mesela, bu son söz verdiğimde olabilir.)

Bunu başarmanın bir yolu dosyayı kapatıp yeniden açmak olacaktır - geri alma geçmişi bu noktada temiz başlar. Ama bu bir güçlük.

Geçmişte, bunu başardım :edit!. Ancak Vim 7.3'te, bu geri alma tarihini atmıyor.

Bunu yapmanın, dosyayı kapatmanın başka bir yolu var mı?


Yani aslında sadece son durumunu yaptığınız gibi dosyanın durumunu geri yüklemek mi istiyorsunuz? aslında istediğiniz gibi 'u' anahtarını git checkout -f fileveya gibi bir şey için yeniden eşlemek ister misiniz hg rollback file?
akira 24:10

@ akira - hayır, ubireysel değişiklikleri geri almak için kullanabilmek istiyorum , ancak en son taahhüt ettiğim noktayı geçmeden . Aynen, her işlem yaptığımda, dosyayı kapattım ve yeniden açtım. :edit!Eskiden yaptığı şey buydu - dosyayı kapatıp yeniden açmak gibiydi. Bu bir taahhüt noktasına bağlı olmak zorunda DEĞİLDİR, tam da en çok istediğim zamandı.
Nathan Long,

ah, bu sorunu çok daha net hale getirir. Sorunuzu biraz değiştirmelisiniz.
akira 24:10

Yanıtlar:


11
:set undoreload=0 | edit

ne istiyorsan onu yapmalısın.


1
Ha! Sadece bu özelliği kapat, ha? :) Bunu fark etmemin neden bu kadar uzun sürdüğünden emin değilim.
Nathan Long,

7

Eski: düzenleme! bir astardaki davranış:

:exe "set ul=-1 | e! | set ul=" . &ul

Bu işe yarıyor. Açıklar mısın lütfen?
Nathan Long

Komut dizisinin sonundaki undolevels ayarının değerini birleştirin (böylece geri yüklenebilir) ve bunları çalıştırır. Daha fazla bilgi için belgelerine bakın: :h :exe, :h :bar, :h :set-args, :h 'ul've :h :edit!.
Aldrik

6

Benoit'in işlevi benim için işe yaramadı, ama vim el kitabında benzer bir şey buldum, burada:

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

Bir fonksiyona tokatladım, vimrc'ime ekledi ve vim 7.3'te iyi çalışıyor gibi görünüyor:

" 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()

Bu ile kullanılabilir :ClearUndo.


1
Gundo eklentisi ile normal çalışma ve dosya yükleme işlemini geri alma, bu şey benim için gerçekten kullanışlı geliyor. Ancak iki şeyi değiştirdim: normal edit komutu yerine (kendisi 7.4'te bazı düzenleme geçmişini bırakıyor), sadece bir düzenleme kullanıyorum! (ve geri alma geçmişini silmeden önce daima yazın). Bazı dahili listeler düzgün güncellenmemiş gibi görünüyor, bu yüzden bunu Gundo eklentisi ile kullanmak istiyorsanız, ek bir düzenleme yapın! fonksiyonların sonunda daha sonra hata yapmasını önleyecektir.
PlazmaHH

@PlasmaHH Geçmişi silme işlevini gönderir misiniz, çünkü neyi değiştirdiğinizi anlamadım ... (belki de gundu kullananlar için bir cevap olarak gönderebilirsiniz). Teşekkürler
Ben,

5

Muhtemelen:

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

( 'ul'için takma addır 'undolevels').


Bu çalışıyor! Şimdi bunu tek bir komut yapmaya çalışıyorum - tercihen :edit!. Başlangıç ​​olarak, listelediğiniz komutlarla ClearUndos () adında bir işlev yaptım, ama onu çağırmak hiçbir şey yapmıyor gibi görünüyor, oysa komutları ayrı ayrı yapmak ...
Nathan Long

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

bu, işlevin içeriği anlamına mı geliyor? İşe yaramıyor, ama belki de yanlış anladım. Ayrıca - belki bunu kendi cevabına taşıyabilirsin?
Nathan Long,

Belki |bir komut içeriğine ham koyamazsınız . Ardından cevabımda söylediklerimi yapan bir fonksiyon yaratın ve komutu ayarlayın call thefunction().
Benoit

3

"Geri alma geçmişini temizle (: varsa geri alma dosyasını silmek için w)
command! -bar UndoClear exe "set ul=-1 | m-1 | let &ul=" . &ul

  • 'Undolevels' değerini -1 olarak ayarladığınızda, geri alma bilgileri hemen silinmez, bu bir sonraki değişiklikte olur; yani m-1, metninizi gerçekten değiştirmez.
  • Ne zaman 'undofile'açıktır, :wgibi geri alma dosyası veya zincir temizlemek için UndoClear|w.

1

Bir komut dosyasında:

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()

Sonra :Resetaramak için kullanın .


İşlev tanımı satırınızın sonunda () ihtiyacı var.
Nathan Long,

Bu gariptir - bu komutları ayrı ayrı çalıştırmak gayet iyi çalışır ve işlev boyunca değerleri tekrarlamak, uygun şekilde ayarlandığını ve ayarlandığını gösterir. Ancak, işlevi çalıştırmak geri alma geçmişimi sıfırlamaz - daha sonra, birden çok kez geri alabilirim. Belki de set ul=komut yalnızca komut dosyası çıkana kadar yerel bir değişkeni etkiler ve komut dosyası çıkmadan önce değiştirdiğimizden, ortamı asla etkilemez? Bu işlevi test ettiniz ve çalışmasını sağladınız mı - anlamı, kurulumumda tuhaf bir şey var mı?
Nathan Long,
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.