Bagaimana cara mengubah string hightlighted secara selektif?

11

Dengan mencari, saya telah menyoroti string yang ingin saya ubah. Sekarang saya ingin mengganti hanya teks yang disorot. Saya menggunakan nuntuk maju ke contoh berikutnya dari string pencarian. Saya berpikir saya bisa melakukan sesuatu seperti ciwtetapi itu mengubah seluruh kata tidak hanya teks yang disorot.

Saya kenal :%s/old/new/gtetapi saya tidak ingin mengubah semua instance. Sebagai gantinya, saya ingin memajukan kursor saya ke setiap instance dan kemudian memutuskan apakah akan mengubahnya.

zundarz
sumber

Jawaban:

16

Gunakan gngerakan untuk mengedit kecocokan pencarian saat ini. Contoh berikut akan mengubah kecocokan saat ini menjadi "FooBar":

cgnFooBar

Bagian terbaik dari teknik ini adalah Anda dapat mengulangi perubahan melalui .. Dengan asumsi pertandingan berikutnya akan diubah dengan cara yang sama yang bisa Anda gunakan .untuk mengulang. Atau lewati beberapa pertandingan via nlalu gunakan ..

Vimcasts memiliki episode yang menyenangkan dalam hal ini: Beroperasi pada pencarian yang cocok menggunakan gn

Untuk bantuan lebih lanjut lihat:

:h gn
Peter Rincker
sumber
Ini jelas cara untuk pergi ketika Anda memiliki string pengganti yang berbeda yang perlu Anda gunakan di tempat yang berbeda. Saya tidak yakin tentang nuansa mode visual yang tampaknya dipicu oleh gn, jadi inilah metode serupa yang baru saja saya temukan:c//e<CR>FooBar<Esc>//<CR>
Jeff
Apakah ada cara untuk mengubah semua pilihan / pertandingan sekaligus? Pada dasarnya, untuk refactor?
Geremia
@ Geremia, ya, :%s/oldtext/newstuff/gakan mengubah semua kecocokan oldtextmenjadi newstuff.
zundarz
@ zundarz Saya tidak ingin melakukan regexp, tetapi hanya mengganti nama variabel. Alih-alih memukul .beberapa kali, saya bisa menggunakan :%norm .( sumber ).
Geremia
7

Jika Anda sudah mencari kata dengan /wordatau ?word.

Anda dapat menggunakan :%s//newword/gcuntuk mengganti kata yang sebelumnya Anda cari newword, dengan membiarkan istilah pencarian ( s//..) kosong.

The cflag mengatakan bahwa setiap perubahan harus dikonfirmasi, dengan menekan yuntuk ya atau ntanpa.

Lihatlah :help :s_flagsuntuk informasi lebih lanjut tentang bendera konfirmasi.

Raphael Ahrens
sumber
1
Saya tahu Anda mengatakan untuk melihat bantuan, tetapi Anda mungkin juga tegas menyebutkan Anda juga dapat pers l, adan q(atau <Esc>) untuk berbagai cara untuk menyelesaikan siklus konfirmasi.
Jeff
2

Metode # 1

Anda dapat memanfaatkan gndan gNmemetakan untuk mencapai apa yang Anda inginkan. gnakan mencari istilah pencarian yang terakhir digunakan dan secara visual memilih kecocokan. gNmelakukan hal yang persis sama, kecuali pencarian mundur. Ketika dikombinasikan dengan operator seperti c, operator akan diterapkan ke pertandingan, Misalnya, jika string pencarian terakhir Anda adalah "foo" dan Anda mengetik cgn, itu akan mencari maju untuk contoh "foo" berikutnya, menghapusnya, dan menempatkan Anda dalam mode sisipkan untuk memasukkan teks pengganti.

Untuk lebih lanjut tentang ini, lihat :help gndan :help gN.

Metode # 2

Anda dapat menggunakan :substituteperintah dengan cbendera. Ini akan meminta Anda untuk mengkonfirmasi setiap substitusi. Misalnya, Anda ingin mengganti foo dengan bilah di seluruh file, tetapi ingin mengonfirmasi setiap penggantian:

:%s/foo/bar/gc

Untuk lebih lanjut tentang ini, lihat topik bantuan ini: :help :s_flags, :help cmdline-ranges, dan :help :substitute.

Pohon cemara
sumber