Etkileşimli arama / değiştirme regex in Vim?


265

Küresel bir değişim için normal ifadeyi biliyorum,

     %s/old/new/g

Vim'de etkileşimli bir arama değiştirme işlemini nasıl gerçekleştirirsiniz ?

Yanıtlar:


462

C işaretini ekleyin (vim komut isteminde):

:%s/old/new/gc

"eski" nin her gerçekleşmesinde size bir evet / hayır istemi verecektir.

metinde "eski" vurgulanır;  pencerenin altında "yenisiyle değiştir (y / n / a / q / l / ^ E / ^ y)?)"

Vim'in yerleşik yardımı, onaylı değiştirme seçildikten sonra mevcut seçenekler hakkında yararlı bilgiler sunar. kullanın:

:h :s

Ardından onaylama seçenekleri ile ilgili bölüme gidin. Aşağıdaki ekran görüntüsü:

"[C] Her değiştirme işlemini onaylayın. [...] CTRL-Y ekranı aşağı kaydırmak için"

Örneğin, bu ve kalan tüm eşleşmeleri değiştirmek için kullanın a.


30
+1, bugün yeni bir şey öğrendim! vim çok gizli sırları var .. :)
Marc Novakowski

10
Vim komutlarını öğrenmek biraz Nethack oynamak gibidir. Tek bir karakterin neyi merak edeceğini asla bilemezsiniz.
Mark Biek

22
"C" nin "onayla" olduğunu hayal ediyorum
matpie

8
Dürüst olmak gerekirse snarky olarak rastlamak çalışmıyorum, ama tüm bunlar sizi doğrudan ": help: s_flags" götürecek ": help: s" yaparak bulunabilirdi.
Jeremy Cantrell

13
@jeremy: bu yardım komutunun var olduğunu bilmek ve ilgili kolon dosyasına gitmek için birinin "iki nokta üst üste" anahtarını yazması gerektiğini bilmek gerekir. Bunu nasıl veya nerede öğrenirsiniz?
Dennis

79

Mark Biek şunları kullanarak dikkat çekti:

%s/old/new/gc

global bir arama için her bir değişiklik için onay ile değiştirin. Ancak, eski metnin doğru eşleşeceğini etkileşimli olarak doğrulamaktan da keyif alıyorum. Önce regex ile bir arama yapıyorum, sonra bu kalıbı tekrar kullanıyorum:

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

s//Geçen arama deseni kullanacaktır.


9
Vim kullanma / öğrenme hakkında en büyük şeylerden biri, tavşan deliğinin ne kadar derine gittiğidir!
ken

2
Güzel, ben her zaman arama yapıyordum, sonra son arama yerine komut yapıştırmak için <Cr> / kullanarak.
Atilla Filiz

Sublime Text'den tam olarak ne özlüyorum!
Xenofex

Bu cevap özellikle kullanışlıdır, çünkü bir sözcüğün örneklerini değiştirmeye karar verdiğinizi birçok kez düşündüğümden, aradığınız sözcük budur.
M_M

20

Aradığınızı düşünüyorum c, örneğin s/abc/123/gc, bu VIM'in değiştirmeleri onaylamasına neden olacaktır. Daha fazla bilgi için bkz. Yardım: ikame.


9

Genellikle find / substitute / next / repeat komutunu kullanırım :-)

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

En Yani find "old", substitute 3 characters for "new", find next, repeat substitute, vb.

Büyük ikameler için bir acıdır, ancak bazı eski oluşumları seçici olarak göz ardı etmenize izin verir ( bir ikameyi tekrarlamak nyerine bir sonrakini bulmak için tekrar basarak .).


Bunu benzer metinler için bile kullanıyorum. (3cW <texthere> <ESC> <yeni konuma taşı>. <move>. <move>.)
strager

1
Bu bir antipattern değil! Tatlı. Ve N tuşunu kullanarak zıt yönde arama yapabilirsiniz. Bir kelime görürseniz ve değiştirmek istiyorsanız gerçekten iyi. * cwNewText <ESC> Nnn (Bu, imlecin altındaki kelimeden uzaklaşacak, ancak bir sonraki olayı değiştirir değiştirmez geri dönecektir.
PEZ

nedir <CR>?
17'de

9

Sadece 'abc' oluşum sayısını saymak istiyorsanız, bunu yapabilirsiniz %s/abc//gn. Bu hiçbir şeyin yerini almaz, sadece 'abc' oluşumlarının sayısını bildirir.


3

Değiştirilen metninizin eşleşen her bir oluşum için değişmesi gerekiyorsa (örneğin, tekil bir değiştirme uygulamak için Evet / Hayır'ı seçmemek değil) etkileşimli değiştirme olarak adlandırdığım bir Vim eklentisini kullanabilirsiniz .


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.