Cara menempelkan blok visual yang dimulai dengan baris lain

10

Butuh waktu sangat lama bagi saya untuk menyadari bahwa menempatkan (menempelkan) sesuatu dengan patau Pyang blok visual pilih dengan ctrl+vdan menarik (disalin) dengan y, mempertahankan cara sebelumnya, sehingga, ketika teks yang disalin berada di tengah-tengah baris, itu kemudian akan disalin di antara teks lainnya jika memungkinkan. Sebaliknya, pilih-baris dengan Vtidak menempelkan garis yang disalin di antara teks lain, tetapi mulai pada baris lain.

Sebagai contoh, misalkan saya miliki sekarang:

12/12: Avocado. Apple.
12/13: Bean.    Banana.
12/14: Cherry.  Citron.
12/15:
12/16:
12/17:

Ketika saya ingin memotong Avocadodan Beandan Cherry, dengan memilih (pemilihan diwakili sebagai _)

12/12: ________ Apple.
12/13: ________ Banana.
12/14: ________ Citron.
12/15:
12/16:
12/17:

dan menekan y, dan memindahkan kursor ke baris berikut (kursor digambarkan sebagai _),

12/12: Avocado. Apple.
12/13: Bean.    Banana.
12/14: Cherry.  Citron.
_2/15:
12/16:
12/17:

dan tekan P. Hasilnya:

12/12: Avocado. Apple.
12/13: Bean.    Banana.
12/14: Cherry.  Citron.
Avocado.12/15:
Bean.   12/16:
Cherry. 12/17:

Tapi yang saya inginkan adalah:

12/12: Avocado. Apple.
12/13: Bean.    Banana.
12/14: Cherry.  Citron.
Avocado.
Bean.   
Cherry. 
12/15:
12/16:
12/17:

Ini membingungkan saya setiap kali, sampai saya menyadari bahwa karena mereka disalin di tengah garis, mereka disisipkan di tengah garis, meniru cara mereka.

Tampaknya cara terbaik untuk menempelkan sesuatu yang dimulai pada baris lain, adalah memindahkan kursor ke awal dengan 0, dan turun 3 baris, ke tempat baru; dan memasuki mode insert dengan i, dan menekan <return>3 kali, dan gerakkan kursor kembali 6 baris, dan kanan, kembali ke tempat semula; dan menyalin, dan lagi pindah ke tempat baru, dan tempel, seperti yang saya lakukan di atas.

Bisakah saya menghemat beberapa pukulan? Atau apa yang biasanya kamu lakukan?

(Sunting: Apa yang dikatakan di atas adalah bagaimana saya memahaminya saat saya menanyakan hal ini. Lihat jawaban-jawaban itu untuk penjelasan yang benar:)

Melanggar
sumber

Jawaban:

11

Ketika Anda menyalin beberapa teks, itu masuk ke register. Teks di dalam register memiliki tipe: characterwise, linewiseatau blockwise.

Jenis ini menentukan bagaimana teks akan diletakkan.

Dalam contoh Anda, Anda menyalin beberapa teks dari mode blok visual. Jadi, teks memiliki jenis blockwisedan disimpan dalam register yang tidak disebutkan namanya ".
Karena jenis ini, ketika Anda akan menempelkannya kembali di dalam buffer Anda, itu akan ditempelkan sebagai blok.


Jika Anda ingin menempelkannya sebagai urutan garis, bukan blok, ada 3 cara.

  1. Dari mode insert, Anda dapat memasukkannya dengan menekan C-r ".
    Ini harus memasukkan isi register yang tidak disebutkan namanya seolah-olah tipenya adalah sama.

  1. Dari baris perintah, Anda dapat menggunakan :putperintah.
    :putSebaiknya tempel teks di dalam register seolah-olah jenisnya adalah garis, tidak peduli jenis aslinya. Perhatikan bahwa Anda dapat meneruskan nama register sebagai argumen, serta alamat baris untuk menentukan di bawah baris mana Anda ingin register ditempelkan.

Sebagai contoh:

:42put a

... harus meletakkan isi register a, di bawah 42garis th.

Tanpa nama register, Vim akan menganggap Anda ingin menempelkan register yang tidak disebutkan namanya (atau +register jika Anda men-tweak 'clipboard').
Dan tanpa alamat, Vim akan menganggap Anda ingin menempelkannya di bawah garis saat ini.


  1. Dari baris perintah, Anda dapat mengubah jenis register tanpa nama dengan setreg()fungsi:

    :call setreg('"', '', 'al')

Di sini, setreg()harus menambahkan string kosong ke register yang tidak disebutkan namanya (terima kasih untuk abendera yang dilewati sebagai argumen ketiga) dan ubah tipenya menjadi garis lurus (berkat lbendera).

Kemudian, dari mode normal, Anda harus dapat menempelkan register, dengan pperintah normal, seolah-olah tipenya sama.


Ini tidak terkait langsung dengan masalah Anda, tetapi ketika Anda menyalin beberapa teks, itu juga masuk ke dalam 0register. Dan jika Anda menambahkan nilai unnamedpluske opsi 'clipboard', ia juga masuk ke +register.

Anda dapat memeriksa apa jenis register, menggunakan getregtype()fungsi:

:echo getregtype('"')

Jika mengembalikan huruf kecil v, itu berarti tipe karakternya.
Jika mengembalikan huruf besar V, berarti jenisnya sama.
Jika kembali ^V{some number}, itu berarti jenisnya adalah blockwise, dan lebar blok adalah {some number}.

pengguna9433424
sumber
3

Saya perlu "membuang" daftar konten ke mode (characterwise / linewise / blockwise) tertentu begitu sering, saya menulis plugin UnconditionalPaste untuk itu. Ini memberikan gcp, glpdll. Alternatif untuk perintah tempel bawaan yang memaksa mode tertentu (dan sekarang beberapa variasi lagi pada tema ini, seperti menempel dengan bergabung dengan koma atau karakter yang ditanyakan).

Dengan itu, Anda bisa menggunakan glp/ glPuntuk menempel setelah / sebelum baris saat ini (sebagai baris baru), terlepas dari bagaimana Anda menarik teks.

Ingo Karkat
sumber
Aku iri padamu bahwa kamu punya waktu untuk menulis hal seperti itu. QQ Tapi aku puas :put. (Juga
mengangkat
@Aminopterin: Saya sudah sering menjawabnya, sebenarnya saya punya snipMate untuk paragraf pertama. Jadi saya hanya perlu menyesuaikan sedikit. Terima kasih telah menghargai jawaban saya, dan upvote!
Ingo Karkat
Oh saya bilang saya iri Anda punya waktu untuk menulis plugin sendiri, seperti ini, seolah-olah dilakukan dengan ringan .... hanya setengah tahun terakhir saya mulai menulis beberapa proyek c ++ sebagai proyek hobi untuk memaksa diri saya belajar pemrograman, dan apakah saya mulai menggunakan vim ~~
Violapterin
2
@Aminopterin Ah, plugin dimulai sebagai cuplikan kecil yang disalin dari Vimtips, dan perlahan-lahan tumbuh seiring waktu. Karena terbukti sangat bermanfaat bagi saya, saya secara bertahap meningkatkannya. Banyak langkah kecil lebih kuat daripada upaya tunggal yang besar!
Ingo Karkat