Pencarian interaktif / ganti regex di Vim?

265

Saya tahu regex untuk melakukan penggantian global,

     %s/old/new/g

Bagaimana cara Anda melakukan pencarian-ganti interaktif di Vim ?

kal
sumber

Jawaban:

463

Tambahkan flag c (pada prompt perintah vim):

:%s/old/new/gc

akan memberi Anda konfirmasi ya / tidak pada setiap kemunculan 'lama'.

"lama" disorot dalam teks;  di bagian bawah jendela tertulis "ganti dengan yang baru (y / n / a / q / l / ^ E / ^ y)?)"

Bantuan bawaan Vim menawarkan info berguna tentang opsi yang tersedia setelah penggantian dengan konfirmasi telah dipilih. Menggunakan:

:h :s

Kemudian gulir ke bagian opsi konfirmasi. Tangkapan layar di bawah ini:

Teks yang mengatakan "[C] Konfirmasikan setiap substitusi. [...] CTRL-Y untuk menggulir layar ke bawah"

Misalnya, untuk mengganti ini dan semua kecocokan yang tersisa, gunakan a.

Mark Biek
sumber
30
+1, saya belajar sesuatu yang baru hari ini! vim memiliki begitu banyak rahasia tersembunyi .. :)
Marc Novakowski
10
Mempelajari perintah vim sedikit mirip dengan bermain Nethack. Anda tidak pernah tahu keajaiban apa yang akan dimiliki oleh satu karakter.
Mark Biek
22
Saya membayangkan "c" adalah untuk "confirm"
matpie
8
Sejujurnya saya tidak mencoba untuk dianggap sebagai snarky, tetapi semua ini bisa ditemukan dengan melakukan ": help: s" yang akan mengarahkan Anda langsung ke ": help: s_flags".
Jeremy Cantrell
13
@ Jeremy: itu membutuhkan mengetahui bahwa perintah bantuan ada, dan mengetahui bahwa seseorang perlu mengetikkan "titik dua" untuk membawa Anda ke file bantuan yang relevan. Bagaimana atau di mana orang akan mempelajarinya?
Dennis
79

Mark Biek menunjukkan menggunakan:

%s/old/new/gc

untuk pencarian global, ganti dengan konfirmasi untuk setiap substitusi. Tapi, saya juga menikmati verifikasi secara interaktif bahwa teks lama akan cocok dengan benar. Pertama saya melakukan pencarian dengan regex, lalu saya menggunakan kembali pola itu:

/old.pattern.to.match
%s//replacement/gc

The s//akan menggunakan pola pencarian terakhir.

Vincent Scheib
sumber
9
Salah satu hal terbesar tentang menggunakan / belajar vim adalah seberapa dalam lubang kelinci!
ken
2
Bagus, saya selalu melakukan pencarian, kemudian menggunakan <Cr> / untuk menempelkan pencarian terakhir ke perintah pengganti.
Atilla Filiz
Persis apa yang saya lewatkan dari Sublime Text!
Xenofex
Jawaban ini sangat berguna, seperti yang saya bayangkan banyak kali Anda memutuskan untuk mengganti contoh kata, itu kata yang baru saja Anda cari.
M_M
20

Saya pikir Anda sedang mencari c, misalnya s/abc/123/gc, ini akan menyebabkan VIM mengkonfirmasi penggantian. Lihat: bantuan: gantikan informasi lebih lanjut.

Logan Capaldo
sumber
9

Saya biasanya menggunakan perintah find / substitute / next / repeat :-)

/old<CR>3snew<ESC>n.n.n.n.n.n.n.

Yang ini find "old", substitute 3 characters for "new", find next, repeat substitute, dan sebagainya.

Ini merepotkan bagi pergantian besar-besaran tetapi memungkinkan Anda secara selektif mengabaikan beberapa kejadian lama (dengan hanya menekan nlagi untuk menemukan yang berikutnya alih-alih .mengulangi pergantian).

paxdiablo
sumber
Saya menggunakan ini juga, bahkan untuk teks serupa. (3cW <texthere> <ESC> <pindah ke lokasi baru>. <move>. <move>.)
strager
1
Ini bukan antipattern! Rasanya manis. Dan Anda dapat mencari di arah yang berlawanan menggunakan N. Sangat bagus jika Anda melihat kata dan ingin mengubahnya. * cwNewText <ESC> Nnn (Ini akan melompat jauh dari kata di bawah kursor, tetapi kemudian melompat kembali segera setelah Anda mengubah kemunculan berikutnya.
PEZ
apa <CR>?
Sother
9

Jika Anda hanya ingin menghitung jumlah kemunculan 'abc' maka Anda bisa melakukannya %s/abc//gn. Ini tidak menggantikan apa pun tetapi hanya melaporkan jumlah kemunculan 'abc'.

Amjith
sumber
3

Jika teks pengganti Anda perlu diubah untuk setiap kejadian yang cocok (yaitu tidak hanya memilih Ya / Tidak untuk menerapkan penggantian tunggal), Anda dapat menggunakan plugin Vim yang saya sebut interaktif-ganti .

ya
sumber