Bagaimana vim menentukan ukuran satu “edit” saat menggunakan “u” dan “CTL-R”?

17

Saat menggunakan uatau CTL-Rmembatalkan atau melakukan edit ulang di vim, saya sepertinya mengubah potongan teks, bukan hanya keystroke terbaru.

Apa yang menentukan ukuran chunk yang dianggap sebagai edit tunggal?

DQdlM
sumber

Jawaban:

19

Anda mencari definisi undo-blocks.

Dari :h undo-blocks:

Satu perintah undo biasanya membatalkan perintah yang diketik, tidak peduli berapa banyak perubahan yang dibuat perintah. Urutan perubahan yang tidak dapat dibatalkan ini membentuk blok undo. Jadi, jika tombol yang diketik memanggil fungsi, semua perintah dalam fungsi tersebut dibatalkan bersama.

Blok yang sama digunakan untuk redo. Dari :h redo:

Perubahan terakhir diingat. Anda dapat menggunakan perintah undo and redo di atas untuk mengembalikan teks menjadi seperti sebelum setiap perubahan. Anda juga dapat menerapkan perubahan lagi, mendapatkan kembali teks sebelum membatalkan.

vappolinario
sumber
4
Anda juga dapat secara manual memecah satu undo-block dengan perintah CTRL-G udalam mode insert, yang berguna jika Anda memiliki beberapa macro mode insert.
fruglemonkey
8

Editing modal vim sering dipandang sebagai Operator (misalnya c, d, ...) diaplikasikan di atas gerak (misalnya iw, w, }, ...). Sebagai produk sampingan yang luar biasa, Vim mendapatkan undian yang tebal. Ketika editor lain harus menebak-nebak untuk membuat banyak undo kecil menjadi blok undo, Vim melakukan ini secara alami. Sisi lain yang mempengaruhi adalah ini memberi Anda operator berulang, .(alias perintah dot).

Pertanyaan Anda secara khusus menyebutkan penekanan tombol jadi saya menganggap Anda ingin tahu cara membatalkan perubahan kecil saat dalam mode sisipkan. Jawabannya adalah ini bukan "jalan Vim". "The Vim Way" berarti Anda akan berada dalam mode penyisipan untuk burst pendek sekaligus. Ini berarti ketika kesalahan dibuat dalam mode penyisipan Anda sering hanya keluar ke mode normal dan memperbaiki teks atau hanya membatalkan u,, dan menulis ulang teks.

Terkadang ada kebutuhan untuk membagi blok undo saat dalam mode insert. Ini dapat dicapai melalui <c-g>usaat dalam mode sisipkan. Lihat :h :undojdan :h undo-blocksuntuk informasi lebih lanjut.

Untuk bantuan lebih lanjut saya sarankan yang berikut:

:h undo-blocks
:h :undoj
:h undo-tree
:h persistent-undo
:h undo.txt

Ada juga beberapa screencasts tentang hal ini:

Peter Rincker
sumber
"Chunky undo" - deskripsi terbaik yang pernah saya lihat.
Matt Parker
6

Anda dapat memikirkannya dengan cara ini juga: setiap kali Anda masuk ke mode insert untuk mengedit teks dan Anda menekan Esc, itu akan membentuk blok. Jika Anda mencoba untuk membatalkan blok itu, Anda akan pergi ke posisi yang sama sebelum Anda memasukkan mode penyisipan.

Karenanya Anda dapat "menyimpan" perubahan Anda hanya dengan keluar dari mode penyisipan dari waktu ke waktu: katakanlah Anda masuk ke mode penyisipan dan menulis fungsi. Anda dapat melanjutkan pengkodean dan pergi ke fungsi berikutnya namun terkadang lebih baik untuk kembali ke mode normal dan beralih ke mode memasukkan lagi. Dengan cara itu, Anda dapat membuat kode Anda terstruktur dengan cara yang sederhana dan jika Anda perlu kembali, Anda bisa tahu di posisi apa Anda akan berakhir.

Catatan: jika Anda menggunakan panah untuk bergerak, itu seperti jika Anda menekan Esc+ [ hjkl]

Wylex
sumber