Bagaimana saya hanya membatalkan teks yang disisipkan di vim?

10

TL; DR; versi - Bagaimana cara membatalkan teks yang disisipkan dari buffer salinan OS saya tanpa membatalkan teks lain yang diketik sejak saya masuk ke mode penyisipan?

Deskripsi yang lebih panjang:

  1. Masukkan sesuatu ke dalam buffer salinan OS Anda (mis. Sorot beberapa teks dan lakukan Command-cdi Mac)
  2. Masuk ke mode insert di vim ( i)
  3. Ketikkan sesuatu (misalnya asdf)
  4. Tanpa keluar dari mode penyisipan, tempel dari buffer salinan Anda ke vim ( Command-vdi Mac)
  5. Memukul escape
  6. Coba batalkan tempel ( u)

Ini membatalkan segalanya sejak terakhir kali Anda masuk ke mode insert. Dengan kata lain, itu akan menghapus asdfsemua teks yang saya tempel.

Bagaimana cara hanya membatalkan teks yang disisipkan di? Apakah saya harus selalu keluar dari mode penyisipan dan kembali sebelum saya menempelkan teks hanya untuk memiliki opsi untuk membatalkan teks yang disisipkan?

Javid Jamae
sumber

Jawaban:

4

Salah satu cara secara eksplisit drop out dan kembali ke mode insert sebelum paste. Jika Anda memperpanjang perintah tempel, Anda juga dapat secara otomatis mengatur titik undo sebelum menempel:

" Any text fragment pasted in insert mode should be undone separately, without
" destroying what was typed before.
inoremap <C-R> <C-G>u<C-R>

Di atas adalah untuk i_CTRL-Rperintah bawaan. Saya tidak tahu bagaimana Command-vini diterapkan di MacVim, tetapi menambahkannya <C-G>upada :imapperintah harus mencapai efek yang sama.

Ingo Karkat
sumber
1
Bekerja seperti pesona, terima kasih! Saya mungkin harus tetap menggunakan metode vim standar untuk menempel.
Javid Jamae
Hanya menambahkan ini: :h i_CTRL-G_u(yaitu, "hancurkan urutan, mulai perubahan baru" dalam mode sisipan).
Toraritte
2

Di MacVim, Anda perlu menghapus peta Edit > Pasteitem menu untuk mengganti pintasan, lalu Anda dapat memetakan ulang Cmd-V ( D-vdalam bahasa MacVim) ke perintah yang sesuai di setiap mode. Saya menambahkan ini ke saya ~/.gvimrcdan sekarang semuanya bekerja dengan luar biasa:

macmenu Edit.Paste key=<nop>
noremap <D-v> "*P
cnoremap <D-v> <C-r><C-o>*
inoremap <D-v> <C-g>u<C-r><C-o>*

Yang <C-g>udiperlukan hanya dalam mode penyisipan untuk memperbaiki riwayat undo; yang noremapdan cnoremaphanya untuk mengembalikan perilaku pasta default di normal dan perintah mode.

Terima kasih kepada Ingo Karkat karena menunjuk saya ke arah yang benar di sini.

Sophie Alpert
sumber
1

Sebenarnya solusinya adalah Anda harus pergi ke mode perintah (misalnya Esc) terlebih dahulu dan masukkan kembali mode insert, tetapi itu hanya berfungsi jika saya mengetik secara manual tetapi tampaknya "secara acak" berhenti bekerja jika saya mengujinya ~/.vimrc. Google tidak membantu sama sekali.

Saya menghabiskan banyak waktu mencoba untuk memperbaiki masalah ini dan saya hanya mencari tahu alasannya dalam kasus saya:

Jangan memetakan kunci tempel yang sama dengan kunci tempel terminal yang ada

misalnya Ctrl+Shift+Vakan sisipkan di terminal Konsole saya, tapi jika saya menetapkan kunci ini <C-S-v>di ~/.vimrc, yang "undo hanya pasta tunggal, bukan beberapa pasta" tidak akan bekerja.

Dalam kasus saya, saya harus menggunakan <C-v>daripada <C-S-v>:

inoremap <C-v> <Esc>"+pi<Esc>i<Right><Right>

Kasing Anda mungkin berbeda, tetapi intinya sama: jangan tetapkan konflik kunci tempel yang sama dengan kunci emulator terminal yang ada.

Saya sudah 100% membuktikan kesimpulan ini dengan mengatur kunci tempel terminal saya ke Ctrl+Vdan sekarang <C-v>berhenti bekerja tetapi <C-S-v>berfungsi.

Perhatikan juga bahwa vim terlalu sensitif dan aneh. Saya pikir saya harus menggunakan idan kemudian 2 tombol Kanan secara manual untuk membuatnya bekerja di posisi kursor yang benar, itu berarti saya harus meletakkan idan 2 tombol Kanan ~/.vimrcjuga. Kasing Anda mungkin berbeda, tetapi intinya sama, pastikan kunci + pesanan di ~ / .vimrc 100% sesuai dengan yang Anda ketik secara manual.

林果 皞
sumber