Bagaimana cara mengganti teks dalam dengan teks yang ditarik


17

Pola pengeditan yang sering saya temui adalah sebagai berikut: Saya ingin menarik sepotong teks di dalam tanda kutip atau tanda kurung, dan mengganti potongan teks itu di dalam sepasang tanda kutip / tanda kurung lain.

Misalnya, jika saya ingin menyalin nama kelas foo bardan menempelkannya di tempat lain:

<span class="foo bar">

<div class="this-should-be-replaced-with-foo-and-bar">

Yang saya tahu adalah ini: Jika saya pindah ke dalam kelas span, saya gunakan yi"untuk menarik teks di dalam tanda kutip.

Sekarang saya memiliki ini di register saya, jadi saya harus dapat mengganti konten kelas div dengan itu. Tetapi saya tidak dapat menemukan cara praktis untuk melakukan ini.

Jika saya menggunakan ciwini akhirnya menimpa register saya dengan konten untuk berubah, jadi saya kehilangan teks saya menarik.

Hal terbaik yang bisa saya dapatkan adalah pindah ke kutipan pertama kelas div, memukul p, lalu menghapus kutipan berikutnya dt".

Biasanya saya mengacaukan posisi saya, dan saya menempelkannya di suatu tempat di dalam tanda kutip yang menggabungkan kedua string, dan itu mengacaukan semuanya.

Saya berharap ada beberapa cara untuk melakukan kombinasi "ganti teks dalam dengan konten yang saya tarik" untuk membuatnya lebih mudah.

Jawaban:


19

Anda bisa menggunakannya vi"psaat di dalam "". Ini dapat menggantikan teks dalam daftar yank, jadi penting ketika Anda ingin menggunakan teks yang disentak lebih dari satu kali.

EDIT : Info tambahan dari komentar Octaviour tentang membuatnya dapat digunakan kembali lebih dari sekali:

Untuk melakukan itu saya akan menarik ke register bernama, yang membuat dua perintah: "ayi"dan dan vi""apjika Anda menggunakan register a.


2
Saya akan menguraikan solusi ini. Anda pertama-tama menarik teks yang ingin Anda salin. Kemudian Anda pergi ke tempat yang ingin Anda tempel, pilih secara visual menggunakan vi ". Perintah paste sekarang akan secara bersamaan meletakkan isi register yang tidak disebutkan namanya pada kursor dan menghapus teks yang dipilih. Oleh karena itu vi" p mencapai apa yang Anda inginkan, tetapi itu mengganti isi register yang tidak disebutkan namanya, melarang Anda menempelkan teks yang sama dua kali. Untuk melakukan itu saya akan menarik ke register bernama, yang membuat dua perintah: "ayi" dan dan vi "" ap jika Anda menggunakan register a.
Octaviour

Terima kasih telah menjelaskan. Ini membantu untuk menjelaskan hal-hal dengan gerakan vim, membuatnya lebih mudah untuk diingat sesudahnya. Ini masih tidak semudah yang saya harapkan, tetapi masuk akal dengan cara vim. Menggunakan perintah dot untuk mengulanginya dan dengan cepat mengganti kedua kalinya sepertinya tidak berfungsi. Saya berharap itu akan menjadi jalan pintas. :)
jurgenb

11

Anda dapat menggunakan register bernomor. Tarik pertama "foo-bar" dengan yi", yang akan mengisi "0register, lihat :h "0. Kemudian lakukan ci"<c-r>0untuk mengganti dengan isi register 0.

Lihat :h i_CTRL-Rdeskripsi bagian terakhir.


2
Mengapa tidak mencabutnya di register tanpa nama ( yi") dan menempelkannya dari register 0tempat menyimpannya setelah Anda menghapus teks yang akan diubah ( ci"<c-r>0)? Dalam hal vimgolf Anda memenangkan 2 penekanan tombol dan Anda tidak mengacaukan register Anda.
statox

segera setelah saya menekan 'a' saya akhirnya dalam mode edit, ini tidak menyalin ke register
jurgenb

@ n3wjack Itu mungkin karena Anda tidak menekan CTRL+rsebelumnya a, itulah <c-r>artinya.
statox

1
@ KarlYngveLervåg Sebenarnya ciwtidak menempatkan teks yang dihapus dalam daftar disebutkan namanya tetapi register bergeser, itu sebabnya Anda harus menggunakan <c-r>0bukan <c-r>". Lihat :h quote_number.
statox

1
Saya akan berpikir, lebih khusus, bahwa poin di sini bukan tentang register yang tidak disebutkan namanya, tetapi tentang register bernomor. The "0Register hanya diisi oleh perintah yank dan tidak akan terganggu oleh misalnya c.
Karl Yngve Lervåg

9

Ini solusi lain. Ini bukan yang terbaik dalam hal Vimgolf, tetapi menggunakan register lubang hitam:

Setelah Anda berada di foo barstring, Anda dapat mencabutnya menggunakan normal yi".

Kemudian di dalam kurung untuk mengubah: "_di"P

Yang mana:

"_       We will use the black hole register
di"      Delete the inner brackets and put the deleted text in the black hole register
P        Put the previously yanked text

Keuntungan dari register lubang hitam adalah tidak akan mengacaukan register orang lain. Lihat :h quote_untuk lebih jelasnya.

(Perhatikan bahwa jawaban ini hanya di sini untuk membicarakan tentang daftar hitam. Saya pribadi menggunakan pilihan visual seperti yang disarankan oleh @grodzik.)


Saya pikir Anda perlu huruf besar Puntuk yang itu. Ketika Anda di"kursor Anda akan ditinggalkan pada tanda kutip terakhir dan pakan menempel setelah, di mana seperti Pakan menempel sebelum posisi saat ini.
jecxjo

@ jecxjo Benar, saya mengedit jawaban saya, terima kasih!
statox

8

Saya sangat membutuhkan ini, saya menulis sebuah plugin untuk menyederhanakan dan memungkinkan kecepatan maksimum: ReplaceWithRegister .

Plugin ini menawarkan perintah dua-dalam-satu gryang menggantikan teks yang dicakup oleh {motion} / objek teks, seluruh baris atau pilihan saat ini dengan isi register; teks lama dihapus ke register black-hole, yaitu hilang. Ini transparan menangani banyak kasus sudut dan memungkinkan untuk pengulangan cepat melalui .perintah standar . Jika Anda tidak menyukainya, lamannya memiliki tautan ke alternatif.


Bagus! Ini harus menjadi vanilla vim.
Philipp Moers
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.