Bagaimana saya bisa menempel (menimpa) dengan vim?

31

Di vimsaya gunakan yydan psepanjang waktu untuk menarik dan menyisipkan baris. Namun, jika saya ingin mengganti satu baris beberapa tempat dalam file, saya tidak dapat menggunakan yy p dd pkarena dd menghapus baris ke clipboard / daftar. Sementara saya mungkin harus tahu cara menggunakan register lebih baik, saya merasa seperti mungkin ada cara untuk pmengganti baris saat ini.

cwd
sumber

Jawaban:

27

Secara default, perintah tempel menggunakan "register ("tidak bernama") . Secara efektif, perintah apa pun yang menulis ke register juga menulis ke register yang tidak disebutkan namanya, sehingga menarik, menghapus, dan mengubah semua memengaruhinya. Inilah sebabnya mengapa urutan yank-delete-paste Anda menempelkan teks yang dihapus alih-alih teks yang ditarik.

The 0mendaftar dapat membantu di sini. Perintah menarik apa pun yang tidak menentukan register, masukkan teks yang ditarik ke dalam register 0(sebagai tambahan "). Ini tidak terpengaruh oleh operasi hapus atau ubah, jadi Anda dapat menggunakannya untuk menempelkan satu baris yang disentak beberapa kali walaupun Anda melakukan penghapusan atau perubahan tingkat menengah.

  1. yy: Register 0dan "keduanya sekarang memiliki jalur menarik.
  2. Pindah ke baris untuk mengganti.
  3. dd: Daftar "sekarang memiliki baris yang dihapus, tetapi daftar 0masih memiliki baris yang ditarik.
    "0P: Tempelkan baris yang awalnya ditarik dari register 0.
  4. Pindah ke baris berikutnya untuk mengganti.
  5. dd"0P (sama seperti di atas)

(Karena cara kerja posisi kursor saat mengganti baris terakhir dari buffer, Anda akan ingin menggunakannya "0psebagai ganti "0P.)

Ini sangat dekat jawaban Bruce Ediger , kecuali bahwa Anda tidak harus menentukan register saat awalnya menarik. Menggunakan satu atau lebih register bernama bisa sangat berguna meskipun jika Anda perlu (misalnya) mengganti beberapa baris dengan AAA, tetapi baris lain dengan BBB(masukkan AAAregister a, dan BBBdalam register b(atau biarkan salah satu dari mereka dalam register 0), kemudian tempel sesuai ).

Anda juga dapat menyisipkan dari 0dalam line-bijaksana modus visual ( V) untuk menyimpan keystroke: V"0p.

Jika Anda tidak seperti memiliki jenis "0, Anda mungkin menemukan pemetaan lebih nyaman:

noremap <Leader>p "0p
noremap <Leader>P "0P
vnoremap <Leader>p "0p

Pendekatan alternatif adalah menghapus ke _register (" lubang hitam") . Ketika Anda menghapusnya, "register tidak terpengaruh, sehingga urutan yank-delete-paste Anda masih dapat menempelkan teks yang ditarik ke bawah dari register yang tidak disebutkan namanya.

  1. yy: Daftar 0dan "keduanya sekarang memiliki jalur menarik.
  2. "_dd: Tidak ada perubahan pada register.
    P: Tempel teks yang awalnya ditarik dari register ".

Sekali lagi, Anda mungkin menemukan pemetaan lebih nyaman:

noremap <Leader>d "_d
Chris Johnsen
sumber
2
Atau, tl; dr, cukup gunakan yy(pindahkan ke baris untuk diganti) S<C-r>0<Esc>. Memiliki keuntungan diulang dengan .perintah.
Wildcard
11

Sepertinya Kevin memiliki jawaban yang cukup bagus, tetapi jika Anda ingin melihat setiap baris yang Anda hapus, ganti, ada solusi yang sedikit berbeda.

1. Find line to copy in some select number of places.
2. Put cursor on it.
3. "ayy copies that line into register 'a'.
4. Find line to replace. Put cursor on it.
5. dd deletes that line. "aP inserts the copied line above where the cursor now lies.
6. Repeat steps 4 and 5.

Resep semacam ini memungkinkan Anda untuk menggunakan pencocokan pola untuk menemukan garis yang akan dihapus dan diganti, dan Anda dapat kembali ke awal file (1G) dan mencari ke depan sesering mungkin. Jika saya memiliki 2 baris atau lebih untuk dikumpulkan dan ditempatkan berulang kali, saya gunakan "ayyuntuk baris pertama, "byyuntuk baris kedua, "cyyuntuk baris ketiga, dan seterusnya. Saya membuat kebiasaan (yang mengurangi generalisasi resep) untuk mengurangi beban mental pada saya.

Bruce Ediger
sumber
Sangat bagus. Jadi jika saya menggunakan "ayydan kemudian dd, ddtidak akan menggantikan apa yang ada di a, tetapi jika saya ketik pitu akan menyisipkan apa yang baru saja dihapus menggunakan dd. Dan jika saya ingin mengganti apa yang ada "ayydengan apa yang saya hapus, maka saya akan menggunakan "add- apakah itu benar?
cwd
"ayy menyalin baris ke register 'a'." dd "memotong baris menjadi register default, bukan 'a'. 'p' menempelkan register default, benar. Dan ya," tambah memotong baris ke register 'a' , yang akan menggantikan konten dari "perintah ayy.
Bruce Ediger
5

Ada beberapa cara untuk melakukan ini :s, tergantung pada seberapa banyak pengetikan yang ingin Anda lakukan. Cara termudah adalah pencarian dan ganti sederhana:

:%s/find this line/replace with this/

The %akan mencari seluruh file dan mengganti semua kejadian.

Jika terlalu banyak mengetik untuk Anda, Anda dapat menarik string tujuan ( yy) dan menggunakan "register (default), memasukkannya dengan Ctrl+r ":

:%s/<ctrl+r><">/replacement/

Atau, jika Anda memiliki salinan string pengganti, Anda dapat menarik keduanya menjadi register terpisah dengan "ayydan "byyuntuk menarik ke dalam adan bregister, masing-masing (Anda dapat menggunakan huruf apa pun untuk register Anda). Kemudian gunakan Ctrl+r adanCtrl+r b rekatkan ke kolom pencarian dan ganti.

Bukan untuk menambah Bruce, tetapi jika Anda ingin memeriksa baris sebelum Anda menggantinya, tambahkan saja copsi:

:%s/find this line/replace with this/c
Kevin
sumber
2

Anda bisa menggunakannya V untuk menyorot garis yang ingin Anda ganti dalam Mode Visual dan kemudian tekan ppuntuk menempelkan garis itu.

Ini hanya menambah satu keystroke, jadi sepertinya solusi yang cukup bagus.

mouche
sumber
Ini tidak berfungsi: setelah tempel, papan klip berisi teks yang ditandai olehV
daniel kullmann
Hanya satu p.
Aaron Thoma
2

Saya menggunakan perintah c, "ubah", cukup sering untuk hal semacam ini, dikombinasikan dengan pencarian biasa. Anda dapat mencari file untuk setiap baris / bagian teks yang Anda minati dan kemudian menggunakan n.perintah berurutan ( nuntuk selanjutnya dan kemudian .mengulangi perubahan terakhir.)

/^hello- temukan garis yang dimulai dengan halo;
c$goodbye- ubah baris menjadi selamat tinggal;
n.- Temukan berulang, ulangi perubahan

Jika Anda ingin mengubah baris ke yang sudah ada dalam file, Anda bisa menyalinnya ke buffer input Anda (dengan asumsi GUI Anda mengizinkannya) dan kemudian menempelkan untuk mendapatkan konten dari perintah perubahan pertama.

Seperti semua hal vi, merupakan ide bagus untuk memiliki banyak opsi di saku Anda, tergantung pada jenis pengeditan yang ingin Anda lakukan.

rghome
sumber