Bagaimana saya bisa dengan aman membatalkan perubahan yang mungkin atau tidak mungkin saya buat?

12

Terlalu sering saya membuat kesalahan mengetik dengan fokus jendela yang salah (dan telah melakukannya beberapa kali dengan autentikator USB). Dalam program dengan banyak hotkey diaktifkan (Gmail, VLC, Vim), ini sering memiliki konsekuensi yang tidak diinginkan dari membuat modifikasi yang tidak diinginkan.

Terkadang saya dapat melacak langkah-langkah saya dan mengingat apa yang telah saya ketik untuk memperbaiki setiap perubahan atau mengembalikan pengaturan yang saya atur jika saya mengetahui diri saya lebih awal. Sayangnya, itu tidak selalu terjadi.

Di Vim, saya bisa memiliki sesuatu yang tidak berbahaya dan jelas seperti mengubah baris teks yang mudah dibatalkan. Atau, saya bisa saja secara tidak sengaja memodifikasi sesuatu yang tidak begitu mudah diidentifikasi. Jika saya secara tidak sengaja mengetik urutan perintah yang tidak diinginkan di Vim, bagaimana saya bisa mengecek dan membatalkan pengeditan atau perubahan pada pengaturan?

JohnB
sumber
1
Apakah Anda mencari tindakan "kembalikan"? :e!akan melakukan itu
Jasper
1
Saya pikir :e!akan buruk jika Anda belum menyimpan sejak kondisi terakhir yang benar, dan umungkin tidak cukup jika Anda mengetik banyak hal. (Jika Anda mengetik date month, misalnya, maka Anda akan menghapus tag, menetapkan tanda, dan melakukan pencarian, yang akan sangat membingungkan untuk u
dibatalkan
1
@WChargin Tidak berbicara tentang umenjadi bagian dari urutan, melakukan beberapa undo di tengah.
yo '

Jawaban:

14

Memohon

:undolist

untuk melihat kapan Anda melakukan set perubahan terakhir. Jika dikatakan ada beberapa perubahan yang dibuat, misalnya, "3 detik yang lalu," dan Anda tahu bahwa Anda hanya sengaja mengubahnya, katakan, semenit yang lalu, kemudian jalankan

:earlier 10s

untuk kembali ke keadaan yang diinginkan. Kalau tidak, jika tidak ada perubahan terbaru, Anda tidak perlu melakukan apa pun.


Referensi lebih lanjut: :help undo-tree .

wchargin
sumber
4

Untuk mengulangi pertanyaan, Anda mencari cara untuk melihat atau mendapat pemberitahuan tentang perubahan yang Anda buat pada file, dan kemudian gunakan fitur undo. Mungkin ada cara lain atau bahkan plugin yang mendukung ini. Tetapi saya akan menjelaskan apa yang telah saya gunakan untuk tujuan yang sama.

Anda menggabungkan fitur vim yang ada untuk menyelesaikan ini. Misalnya, Anda dapat mendefinisikan fungsi seperti:

" Function: View changes after the last save
function! s:DiffSinceSave()
  let filetype=&ft
  diffthis
  vnew | r # | normal! 1Gdd
  diffthis
  exe "setlocal bt=nofile bh=wipe nobl noswf ro ft=" . filetype
  exe "normal! ]c"
endfunction
com! DiffSaved call s:DiffSinceSave()

Anda kemudian dapat memanggilnya nanti dan bahkan memetakan tombol pintas.

" Map key to function: View changes after the last save
nnoremap <leader>? :DiffSaved<CR>

Ini akan membuka tampilan berbeda berdasarkan jendela split yang akan menunjukkan Anda perubahan yang dibuat sejak penyimpanan terakhir. Setelah Anda mengidentifikasi perubahan yang dibuat, maka Anda dapat keluar dari tampilan itu dan menggunakan fitur vim lainnya seperti undo dan undo tree, dll. Atau bahkan plugin untuk kembali ke status sebelumnya.

Saya menyadari bahwa ini tidak ideal karena Anda harus memiliki jenis alur kerja tertentu agar ini berguna. Tetapi ini bekerja dengan cukup baik. Dan di sisi positifnya, kami tidak mengubah cara kerja vim atau mengandalkan apa pun di luar.

Saya harap Anda menemukan ini berguna. Saya mengadaptasi solusi ini beberapa waktu lalu dari cuplikan yang ditemukan di Internet termasuk vim Wikia. Jadi di situlah kredit jatuh tempo.

memberi
sumber
3

Bagi saya, jawaban sederhana untuk ini adalah menekan usampai Anda membatalkan perubahan yang ingin Anda simpan, lalu tekan Ctrl-R.

superjer
sumber
0

Seperti @superjer, saya terus menekan usampai [+]penanda merah di status saya menghilang.

set statusline=%f\ %#Error#%m%##
joeytwiddle
sumber
Mungkin menyenangkan memiliki kunci untuk membatalkan secara otomatis kembali ke keadaan terakhir yang tidak dimodifikasi. Tetapi :e!juga merupakan solusi yang bagus; hari ini Vim bahkan akan membuat perubahan "dibuang" Anda dalam sejarah undo.
joeytwiddle
5
Perintah itu :earlier 1f. The 1fberarti "1 state disimpan sebelumnya", sehingga akan kembali ke waktu sebelumnya Anda menyimpan file. Jika buffer diubah, maka itu membatalkan semua modifikasi. Jika buffer tidak diubah (yaitu, saat ini dalam keadaan disimpan), maka itu akan pergi ke waktu sebelumnya Anda menyimpan file.
jamessan