Tempel beberapa kali

93

Apa cara terbaik untuk mengganti beberapa baris dengan konten clipboard?

Masalah yang saya alami adalah ketika saya menarik sebuah baris dan menempelkannya di atas baris lain, "yank" diganti dengan baris yang baru saja saya ganti. Sekarang, jika saya ingin mengganti baris lain dengan baris yang sama, saya harus kembali ke atas dan menariknya lagi.

Pasti ada cara yang lebih baik untuk melakukan ini.

jwerre
sumber

Jawaban:

108

Saya memiliki ini di .vimrc saya:

xnoremap p pgvy

(catatan: ini hanya akan bekerja dengan register default, tetapi pemetaan ini mudah diingat). Menulis versi yang lebih rumit akan dimungkinkan. Selain itu, Anda masih dapat menggunakan P untuk mendapatkan perilaku lama.

Benoit
sumber
28
Pintar. 'p' untuk menempelkan, 'gv' untuk memilih ulang apa yang awalnya dipilih. 'y' untuk menyalinnya lagi.
Amjith
@SibbsGambling, mungkin menggunakan versi sebelum Vim 7? Kemudian tingkatkan Vim, atau gunakan v sebagai ganti x ( vnoremap). File bantuan Vim version7.txtmenyatakan xmap dan smap muncul di versi itu.
Benoit
1
@Benoit Hmm, saya punya 7.4.52, tapi tidak xnoremapjuga vnoremapbekerja
Perjudian Sibbs
8
Mengapa ini bukan perilaku default ??
Seth
27

"0harus memiliki isi yank Anda. Sedikit lebih membosankan untuk mengetik, tetapi "0pharus melakukan apa yang Anda inginkan.

Sebagai alternatif, jangan pilih-dan-ganti garis lama di depan. Jika Anda menemukan baris-baris itu dengan pencarian, tekan n.terus-menerus (setelah inisial p), lalu ketika semuanya ditempel, lakukan ndddiikuti sebanyak yang n.diperlukan.

Peralihan mental terbesar yang perlu saya lakukan saat pindah ke Vim adalah mencari cara untuk menerapkan pengeditan grup secara berurutan. Yaitu daripada melakukan banyak pengeditan pada satu baris dan kemudian melakukan banyak pengeditan yang sama di baris lain, saya akan melakukan pengeditan pertama pada sekelompok baris (menggunakan .untuk efek yang hebat), kemudian pengeditan kedua pada banyak baris baris, dll. Alternatifnya, penggunaan makro dapat membantu karena fantastis, tetapi terkadang sedikit lebih membosankan untuk bekerja dengan benar dengan perubahan "kompleks".

dasbor-tom-bang
sumber
2
terdengar seperti tempat di mana regex dengan :%s/.../.../gcperintah tipe konfirmasi mungkin lebih dekat dengan apa yang Anda inginkan
Milimetrik
@Milimetric +1 tidak tahu Anda bisa mengonfirmasi seperti itu.
1
Upvoting karena makro dapat menjadikan ini bukan masalah. Cukup edit sekali, dan Anda dapat melakukan sesuatu seperti 5@m(untuk makro bernama m)
skatenerd
Terima kasih atas penjelasan yang bagus. Sekarang saya gunakan xnoremap p "0pdi ~ / .vimrc
nexayq
13

Saya sering menggunakan registri lain, salin baris yang Anda perlukan ke beberapa registri bernama "aydan kemudian tempel dari sana"ap

Facundo Casco
sumber
11

Saat Anda menempelkan pilihan di Vim, ini akan menggantikan register default dengan konten pilihan. Jika menempelkan pilihan menghapus isi register clipboard maka kemungkinan besar Anda memiliki baris berikut di .vimrc Anda

set clipboard=unnamed

Salah satu opsinya adalah menghapusnya dan menggunakan register papan klip eksplisit "+

Pilihan lainnya adalah dengan menggunakan register lain yang bernama eksplisit (az). Setelah tempel pertama, tarik garis kembali ke "cmisalnya dan kemudian gunakan "cpuntuk menempelkan dari sana ke luar.

JaredPar
sumber
Sebenarnya default (di sini, di Ubuntu) adalah clipboard = autoselect; tetap saja, terima kasih atas jawaban paling elegan sejauh ini.
Tobu
8

gunakan npwhere nadalah jumlah waktu yang Anda inginkan untuk menempelkan baris misalnya 3pakan menempelkan 3 baris.

toopay
sumber
7
Tidak berfungsi saat Anda ingin menempelkan baris yang sama ke baris yang tidak bersebelahan.
Tobu
@Tobu tetapi itu menjawab judul pertanyaan ini 'bagaimana Anda menempelkan beberapa kali'
icc97
6

Alih-alih menggunakan salin / tempel, sering kali lebih baik menggunakan perintah objek teks seperti ciwmengubah kata bagian dalam. Metode ini memiliki keuntungan karena mudah diulang menggunakan .perintah ulangi.

  1. yiw Yank kata batin (salin kata di bawah kursor, ucapkan "pertama").
  2. ... Pindahkan kursor ke kata lain (ucapkan "detik").
  3. ciw<C-r>0 Ubah "kedua", ganti dengan "pertama" (adalah Ctrl-R).
  4. ... Pindahkan kursor ke kata lain (ucapkan "ketiga").
  5. . Ubah "ketiga", ganti dengan "pertama".
jack guan
sumber
1
ciw<C-r>0tidak bekerja dalam kasus saya. ciwberubah ke mode penyisipan di mana <C-r>menjadi tidak berguna. Adakah penjelasan yang mudah untuk ini? Mungkinkah itu ada hubungannya dengan texteditor (saya tidak menggunakan pur VIM tetapi binding Keyboard VIM di RStudio)
Bushroot
@Bushroot <C-r>dimaksudkan untuk digunakan dalam mode penyisipan, karena begitulah cara Anda menempel dari register tanpa meninggalkan mode penyisipan — di Vim, yaitu; Saya tidak terbiasa dengan RStudio tetapi saya rasa Anda benar dan mereka belum menerapkan pengikatan kunci khusus ini.
Insectean
@ Sean H: Ya. Mereka tidak menerapkan pengikatan kunci. Ia bekerja dengan baik di VIM dan bahkan dengan VIM binding di program lain (misalnya Visual Studio Code).
Bushroot