vim - bagaimana saya bisa melakukan 'mengubah kata' menggunakan buffer tempel saat ini

86

Saya memiliki beberapa teks dalam buffer tempel, misalnya saya melakukan yw(kata yank) dan sekarang saya memiliki 'foo' di buffer saya.

Saya sekarang pergi ke kata 'bar' dan saya ingin menggantinya dengan buffer paste.

Untuk mengganti teks secara manual saya bisa lakukan cwdan kemudian ketik kata baru.

Bagaimana saya bisa melakukan 'mengubah kata' tetapi menggunakan isi buffer tempel saya alih-alih mengetik kata pengganti secara manual?

Pilihan terbaik yang saya miliki saat ini adalah pergi ke awal kata yang ingin saya ganti dan lakukan dw(hapus kata), kemudian pergi ke tempat lain dan lakukan yw(kata yank), kemudian kembali ke area penggantian dan lakukan p(Tempel) yang agak canggung terutama jika mereka tidak berada di layar yang sama.

Michael Durrant
sumber

Jawaban:

120

Pilihan 1

Anda bisa menggunakan register untuk melakukannya dan membuat ikatan kunci untuk proses tersebut.

Tarik kata yang ingin Anda ganti yw.

Kata menarik di dalam 0register yang dapat Anda lihat dengan mengeluarkan :registers.

Buka kata yang ingin Anda ganti dan lakukan cw. Lakukan Ctrl+ rdiikuti oleh 0untuk menempelkan 0register.

Peta untuk itu akan terlihat seperti ini (dengan menganggap Ctrl+ jsebagai kombo kunci kami):

:map <C-j> cw<C-r>0<ESC>

Opsi 2 (lebih sederhana)

Dengan kata Anda menarik, kursor kata yang ingin Anda ganti dan lakukan viwp. Yang secara visual pilih kata dalam dan tempel.

Atas perkenan @tlo di komentar: Anda juga bisa melakukannya vep. Satu arang lebih pendek. Downside harus memposisikan kursor pada awal kata dan (seperti milik saya) mengubah buffer.

Komentar (dari Michael):

Ini bagus. Catatan tambahan: metode kedua memang lebih mudah tetapi, seperti, hanya berfungsi untuk SATU substitusi karena setelah setiap substitusi buffer kemudian akan diubah ke bidang yang diganti (teks lama). Metode pertama sedikit lebih sulit untuk digunakan TETAPI memiliki keuntungan bahwa buffer 0 tetap 'sebagaimana adanya' sehingga Anda dapat menggunakan metode itu untuk melakukan lebih dari 1 penggantian teks yang sama.

jathath
sumber
14
Opsi 3 (lebih sederhana): Dengan kata Anda ditarik, kursor ke karakter pertama dari kata yang ingin Anda ganti dan lakukan vep.
tlo
Saya suka Opsi 3 ketika hanya ada 1 kata untuk diubah. Jika ada lebih dari satu kata yang sama untuk diubah, Opsi 1 memungkinkan saya untuk menggunakan. operator untuk mengulanginya ..
typelogic
3
ve"0pakan bekerja agar Anda mengulangi perubahan Anda
JKillian
Jika Anda akan memetakannya untuk sesuatu, mungkin lebih baik digunakan: map <C-j> ciw<C-r>0<ESC>sehingga tidak masalah dari mana dalam kata yang Anda tekan ^j.
Paul Parker
Siapa pun yang ingin tahu mengapa CTRL-R melakukan sihir: :help insertlalu cari CTRL-R /CTRL-R. Untuk cara ve"0pkerjanya, lihat:help registers
Paul Parker
12

ywuntuk menarik kata Anda, kemudian memindahkan kursor ke kata yang ingin Anda ganti dan gunakan "_dwuntuk menghapusnya, mengirim teks ke register nol (sehingga tidak menimpa isi "register, di mana teks yang ditarik / potong secara default ), lalu cukup tempel dengan p.

Anda bisa menggunakan pemetaan berikut ini untuk membuat segalanya lebih mudah:

nnoremap <leader>d "_d

... jadi dalam mode normal, Anda dapat menggunakan \dwuntuk menghapus kata, tanpa memengaruhi "register.

Evilsoup
sumber
3

Untuk melakukan ini dengan cara VIM, Anda sengaja menggunakan yank, delete, dan register lainnya.

Daftar "0adalah daftar yank. Apa pun yang Anda tarik akan diletakkan di sini, tetapi penghapusan tidak pernah menyentuh daftar "0.

Jadi, dalam contoh Anda, Anda baru saja menarik kata. Untuk mengganti kata dengan apa yang baru saja Anda tarik, Anda memanfaatkan penghapusan tidak pernah menyentuh daftar penarikan. Jadi pindahlah ke kata target, hapus dengan dw, lalu rekatkan dari yank-register Anda dengan "0p, atau lebih baik lagi, cwlalu ^R0(yang dapat diulang).

Yang berseberangan dengan register yank adalah register penghapusan kecil "-. Penghapusan kecil atau ubah penghapusan dilakukan di sini, tetapi yank tidak pernah menyentuh "-. Penghapusan dianggap sekecil jika kurang dari satu baris penuh.

Register "1- "9adalah register histori hapus. Dengan "1mengandung penghapusan besar terbaru atau perubahan penghapusan, dan "9berisi penghapusan besar tertua atau perubahan penghapusan. Hanya penghapusan yang tidak kecil, yaitu penghapusan satu baris atau lebih, didorong ke "1- "9.

Untuk operasi apa pun yang mengubah register, salinan juga selalu ditempatkan di default, alias register tanpa nama "". Ini adalah register yang digunakan ketika Anda tidak secara eksplisit menyebutkan nama suatu register.

Register "_adalah register black hole, dan selalu kosong. Jika Anda menghapusnya, tidak ada dalam register yang berubah sama sekali, bahkan ""register default , atau register black hole itu sendiri. Teks yang dihapus sepenuhnya hilang, terlepas dari riwayat undo Anda. Yanking to, atau paste dari daftar lubang hitam pada dasarnya tidak melakukan apa pun.

Register lubang hitam "_memungkinkan Anda melakukan hal-hal seperti pertama penghapusan kecil, lalu sejumlah penghapusan lainnya "_tanpa mengubah register penghapusan kecil Anda "-, lalu tempel penghapusan kecil pertama Anda.

Register lain adalah register yang dimasukkan terakhir "., register nama file "%dan "#, register perintah ":, register pencarian "/dan register ekspresi "=.

Anda bisa mendapatkan daftar semua register ini dan isinya dengan perintah :register. Perintah itu sangat berguna untuk bereksperimen dan mempelajari apa yang berakhir di mana.

00rometheus
sumber
2

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.

Ingo Karkat
sumber
2

Untuk mengulangi pasta gunakan perintah perubahan.

cw ^R0ESC (^ R = Kontrol + R; 0 untuk register 0)

akan mengganti kata dengan konten dari reg. 0 dan mari kita ulangi.

Ini bagus untuk cgn(VIM 7.4) untuk mengganti pola pencarian:

  • Pencarian pertama dengan /atau*
  • cgn ^R0ESC
  • .untuk mengulangi pertandingan berikutnya atau nuntuk melompat
laktak
sumber
1

Karena belum termasuk, Anda biasanya mengganti string dengan :%s/.../.../dan Anda dapat melakukan ini dengan kata di bawah kursor Anda juga.

  1. Anda memasukkan bagian pertama dari perintah, apa yang Anda cari: :s/find/
  2. Kemudian Anda mengklik <ctrl-r>dan memilih dengan kursor kata yang ingin Anda gantikan.
  3. Kemudian Anda mengklik <ctrl-w>("kata") atau <ctrl-a>(kata "besar") untuk menempelkan kata di bawah kursor ke dalam baris perintah
  4. Kemudian Anda menyelesaikan perintah.

Lihat tautan tentang cara menggunakan hal-hal kursor di baris perintah .

erikbwork
sumber
1

Saya biasanya menggunakan ini: ywuntuk mencabut foo, lalu menghapus bardengan dw, dan sebagai langkah terakhir, dimasukkan foodari register 0yang menyimpan teks yang ditarik menggunakan "0p. Ulangi menempatkan dengan titik ( .) sesuai kebutuhan.

Selain itu, alih-alih ywdan dw, Anda dapat menggunakan yiwdan diw(perhatikan tambahan i- artinya di dalam ). Dengan itu Anda dapat menarik atau menghapus kata dari lokasi mana pun di dalamnya, tidak hanya di awal kata.

Nino
sumber
0

Saya menggunakan plugin ini untuk memperluas wilayah pilihan: https://github.com/terryma/vim-expand-region

Jadi kombinasi saya untuk mengubah kata adalah: vvpdi sembarang tempat kata.

Saya juga memiliki peretasan untuk menyimpan konten daftar yang tidak disebutkan namanya setelah ditempel sehingga saya dapat mengulanginya.

vnoremap p p:let @"=@0 <CR>
vnoremap P P:let @"=@0 <CR>

(clipboard saya dipilih otomatis)

pengguna2656799
sumber
0

Saya menggunakan pemetaan kunci di bawah ini untuk mengganti kata saat ini dengan kata yang disalin.
" replace with Register 0
map <leader>rr ciw<C-r>0<Esc>

yiwmenyalin sebuah kata. Arahkan ke sebuah kata. ,rrganti kata.
Kunci pemimpin adalah peta ,.

Nelayan
sumber
,rwakan lebih masuk akal, dan pada QWERTY mungkin smidgen lebih mudah dan lebih cepat untuk keluar. Pada DVORAK, saya memilih ,rc, yang meskipun tidak masuk akal sama sekali, lebih mudah dan lebih cepat daripada mereka semua. Di DVORAK, ,rwada pertunjukan horor;)
Paul Parker
0

Pertama, navigasikan ke awal kata yang ingin Anda tarik. Jika Anda berada di tengah kata, lakukan saja buntuk kembali ke awal. Kemudian lakukan yeuntuk menarik seluruh kata, tanpa spasi tambahan ( yank ke end). Akhirnya, buka kata yang ingin Anda ganti - mungkin dengan melakukan wbeberapa kali - dan lakukan vepuntuk masuk ke vmode pemilihan isual, pilih ke ekata, dan paste isi yang terakhir disentak.

(Jika ada yang ingin tahu mengapa saya tidak hanya mengomentari jawaban yang diterima, untuk modifikasi kecil yedaripada menggunakan yw, itu karena reputasi saya di tumpukan ini masih terlalu rendah.)

Anomali
sumber
0
  1. gunakan ywuntuk menarik dunia, pergi ke dunia yang ingin Anda ubah.
  2. gunakan vuntuk memilih dunia, veatau vwtergantung pada situasi Anda.
  3. masukkan pke paster dunia yang Anda salin untuk mengganti blok yang dipilih
ramwin
sumber
0

Menambah jawaban lain yang lebih baik. Agak terlalu jelas tetapi Anda bisa menempelkannya sebelum menghapus. 'yw' lalu buka kata yang ingin Anda ganti, 'pldw' (rekatkan, geser satu karakter ke kanan, hapus kata.

Ali Almoullim
sumber