Batalkan dalam mode sisipkan

23

Apakah ada perintah untuk membatalkan operasi terakhir yang dilakukan saat dalam mode insert?

Saya baru saja menempelkan teks dari register yang salah menggunakan <C-r>, dan saya punya dua opsi:

  1. Hapus dengan tangan apa yang baru saja saya tempel dan mulai lagi dari awal.
  2. Beralih ke mode normal, tekan udan kehilangan teks yang saya ketik sebelum memukul <C-r>.

Apakah ada cara yang lebih baik?

zool
sumber

Jawaban:

16

Vim menawarkan kemampuan terbatas untuk menentukan lingkup perubahan yang tidak dapat dibatalkan dengan Ctrl-G uperintah, yang memecah urutan pembatalan. Lihat

:help i_CTRL-G_u

Dalam kasus Anda, solusinya adalah memetakan kembali <C-R>seperti ini:

:inoremap <C-R> <C-G>u<C-R>

Kemudian mengetik <C-O>uakan membatalkan perubahan yang dilakukan sejak Anda mengetik <C-R>. Lihat

:help i_CTRL-O
garyjohn
sumber
1
Itu brilian, saya tidak tahu tentang perintah ini. Ada cukup lama penundaan antara mengetik <C-O>udan melihat hasilnya di layar (sekitar 4 detik), ada ide tentang bagaimana saya bisa menyingkirkan itu?
zool
Saya perhatikan itu juga. Saya tidak tahu; Saya akan mencoba mencari tahu.
garyjohn
Hai, apakah mungkin Anda maksudkan <CR> (carriage return) daripada <CR> (ctrl-r)?
Derwent
Tidak. Pertanyaan asli terkait dengan perilaku <CR>, jadi itulah yang digunakan pemetaan. Namun, Anda bisa mengganti <CR> dengan <CR> dalam pemetaan itu agar urutan undo terganggu oleh <CR> sebagai gantinya. Lebih banyak contoh dapat ditemukan di :help i_CTRL-G_u.
garyjohn
6

Dari mode penyisipan:

  1. Jika teks yang Anda tempel lebih kecil dari satu baris (yang menyiratkan poin kedua Anda), cukup tekan <C-u>untuk menghapus semua karakter sebelum kursor di baris saat ini.

  2. Jika teks disisipkan lebih dari satu baris, solusi 2 Anda akan bekerja lebih baik, diadaptasi sebagai berikut: <C-o>u.

Kedua poin di atas akan mulai dan tetap - atau selesai - dalam mode insert; mereka sebenarnya sama dengan solusi yang Anda usulkan, hanya dibuat lebih pendek :)

VanLaser
sumber
6

Anda bisa mencoba <C-w>(menghapus kata ke kiri) atau <C-u>(menghapus karakter sebelum kursor saat ditekan sekali, menghapus linebreak saat ditekan kedua kalinya). Lihat :help i_CTRL-Wdan :help i_CTRL-U.

Jika Anda menempel banyak dari register, tentu saja ini lebih cepat untuk membatalkan perubahan Anda, Anda dapat menggunakan mode insert-normal- <C-o>for untuk itu (jalankan satu perintah mode normal kemudian kembali ke mode insert).

Secara umum akan sangat membantu untuk memotong editan Anda menjadi potongan-potongan kecil dengan sering kembali ke mode normal, sehingga Anda memiliki kemungkinan undo berbutir halus.

cbaumhardt
sumber