Bagaimana saya bisa membuang riwayat undo saya di vim?

23

Membatalkan bagus untuk dimiliki di Vim. Tetapi kadang-kadang, pada titik yang diketahui baik, saya ingin menghapus riwayat undo saya - untuk dapat digunakan uuntuk membatalkan perubahan individu, tetapi hanya kembali ke titik tertentu. (Misalnya, ini mungkin ketika saya terakhir berkomitmen.)

Salah satu cara untuk mencapai ini adalah dengan menutup dan membuka kembali file - sejarah undo mulai bersih pada saat itu. Tapi itu merepotkan.

Di masa lalu, saya menyelesaikan ini dengan :edit!. Namun dalam Vim 7.3, itu tidak membuang sejarah undo.

Apakah ada cara lain untuk melakukan ini, selain dari menutup file?

Nathan Long
sumber
jadi Anda sebenarnya hanya ingin mengembalikan keadaan file seperti pada komit terakhir Anda? Anda ingin dasarnya hanya memetakan kembali kunci 'u' untuk sesuatu seperti git checkout -f fileatau hg rollback file?
akira
@ Akira - tidak, saya ingin dapat menggunakan uuntuk membatalkan perubahan individu, tetapi tidak melewati titik di mana saya terakhir berkomitmen. Persis seperti, setiap kali saya berkomitmen, saya menutup file dan membukanya kembali. Yang :edit!biasa dilakukan - rasanya seperti menutup file dan membukanya kembali. Ini TIDAK HARUS terikat pada titik komit, itu hanya saat ketika saya paling sering menginginkannya.
Nathan Long
ah, itu membuat masalahnya jauh lebih jelas. Anda harus sedikit mengubah pertanyaan Anda.
akira

Jawaban:

11
:set undoreload=0 | edit

harus melakukan apa yang Anda minta.

Steven
sumber
1
Ha! Matikan saja fitur itu, eh? :) Tidak yakin mengapa butuh waktu lama bagi saya untuk menyadari hal ini.
Nathan Long
7

Yang lama: edit! perilaku dalam satu baris:

:exe "set ul=-1 | e! | set ul=" . &ul
Aldrik
sumber
Itu berhasil. Maukah Anda menjelaskannya?
Nathan Long
Menggabungkan nilai pengaturan undolevel pada akhir string perintah (sehingga dapat dikembalikan) dan menjalankannya. Untuk info lebih lanjut lihat dokumentasi: :h :exe, :h :bar, :h :set-args, :h 'ul'dan :h :edit!.
Aldrik
6

Fungsi Benoit tidak berfungsi untuk saya, tetapi saya menemukan sesuatu yang serupa dalam manual vim, di sini:

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

Saya menamparnya menjadi fungsi, ditambahkan ke vimrc saya dan tampaknya berfungsi dengan baik pada 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()

Ini dapat digunakan dengan :ClearUndo.

Nycto
sumber
1
Bekerja secara normal dengan plugin Gundo dan membatalkan pemuatan file, hal ini sangat berguna bagi saya. Namun, saya mengubah dua hal: alih-alih perintah edit normal (yang sepertinya meninggalkan beberapa edit sejarah pada 7.4), saya hanya menggunakan edit! (dan selalu menulis sebelum menghapus sejarah yang dibatalkan). Tampaknya beberapa daftar internal tidak diperbarui dengan benar, jadi jika Anda ingin menggunakan ini dengan plugin Gundo, lakukan pengeditan tambahan! di akhir fungsi akan mencegahnya dari kesalahan nanti.
PlasmaHH
@PlasmaHH Bisakah Anda memposting fungsi untuk menghapus riwayat undo, karena saya tidak mengerti apa yang Anda ubah ... (Anda mungkin bisa mempostingnya sebagai jawaban bagi kita yang menggunakan gundu). Terima kasih
Ben
5

Mungkin:

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

( 'ul'alias untuk 'undolevels').

Benoit
sumber
Ini bekerja! Sekarang saya mencoba membuat satu perintah melakukan itu - lebih disukai :edit!. Sebagai permulaan, saya telah membuat fungsi yang disebut ClearUndos () dengan perintah yang Anda daftarkan, tetapi memanggilnya tampaknya tidak melakukan apa-apa, sedangkan melakukan perintah secara individual tidak ...
Nathan Long
3
:command -nargs=0 Reset let old_ul=&ul | set ul=-1 | e! | let &ul = old_ul | unlet old_ul
Benoit
Apakah itu dimaksudkan untuk menjadi isi dari fungsi? Ini tidak bekerja untuk saya, tapi mungkin saya salah paham. Juga - mungkin pindahkan ini ke jawabannya sendiri?
Nathan Long
Mungkin Anda tidak dapat memasukkan mentah |ke konten perintah. Kemudian buat fungsi yang melakukan apa yang saya katakan dalam jawaban saya, dan atur perintah kecall thefunction() .
Benoit
3

"Hapus riwayat undo (: w untuk menghapus file undo jika disajikan)
command! -bar UndoClear exe "set ul=-1 | m-1 | let &ul=" . &ul

  • Ketika Anda mengatur 'undolevels' ke -1 informasi undo tidak segera dihapus, ini terjadi pada perubahan berikutnya, yaitu m-1, yang tidak benar-benar mengubah teks Anda.
  • Kapan 'undofile' aktif, :wuntuk menghapus file undo, atau rantai suka UndoClear|w.
Bohr
sumber
1

Dalam naskah:

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

Kemudian gunakan :Resetuntuk menyebutnya.

Benoit
sumber
Baris definisi fungsi Anda perlu () di akhir.
Nathan Long
Ini aneh - menjalankan perintah-perintah itu secara individual berfungsi dengan baik, dan menggemakan nilai-nilai di seluruh fungsi menunjukkan bahwa mereka diatur dan tidak disetel dengan tepat. Tetapi menjalankan fungsi tidak mengatur ulang riwayat undo saya - setelah itu, saya masih dapat membatalkan beberapa kali. Mungkin set ul=perintah hanya memengaruhi variabel lokal sampai skrip keluar, dan karena kita mengubahnya kembali sebelum skrip keluar, tidak pernah memengaruhi lingkungan? Apakah Anda menguji fungsi ini dan membuatnya berfungsi - artinya, apakah ada yang aneh dengan pengaturan saya?
Nathan Long