2012-03-02 24 views
5

args and argdo commands'un bir bileşimini kullanarak dosyadaki tüm dize olaylarının Vim içerisindeki yerini almanın bir yolu vardır. Ne yazık ki bu çözümle ilgili bir dezavantaj var: Büyük projeler için sorun olabilecek tüm dosyaları açacak. Herkes daha kompakt ve hafıza açısından verimli bir yol biliyor mu? İşteVim: Büyük bir projede bul ve değiştir?

+3

Vim kullanıyor musunuz? Sed kullanayım, bu iş için daha iyi bir araç. –

+0

@GregHewgill Vim regexp'deki "gc" bayrağı gibi belirli bir değişikliği onaylama şansına sahip olmak isterim. Sadece 'sed -i' kullanmak benim için biraz tehlikeli görünüyor. – nab

+0

Yine de tüm değişikliklere bakacak olursanız, sed kullanın ve sonra ortaya çıkan farklılığı inceleyin. –

cevap

6
find projectfolder -type f -exec grep -Iq 'pattern' {} \; -exec vim {} + 
+0

Bu çözümle ilgili küçük bir sorun var: 'Vim: Uyarı: Giriş, terminalden değil, vim bırakıldıktan sonra bozuk bir konsola neden olur. Bunun nedeni, xargs'ın argüman komutlarını standart girişin kullanıcının terminali olmadığı bir ortamda çalıştırmasıdır. Bu yüzden bir şey öneririm: 'projectfolder -type f -exec grep -Iq 'pattern' {} \; -print | xargs sh -c ' nab

+0

@nab İyi nokta. Bazı testlerden sonra, (en azından benim için) en azından, -print0 | xargs ... '' '' '… Aslında biraz mantıklı, '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '•' '' '' '' '' '•' '' '' '' '•' '' '' '' '' '' '' '' '' • '' '' '' ' Gördüğüm ikisi arasındaki ilk fonksiyonel fark bu. – Kevin

3

(Ben perl kullanmadığımda) bunun için gereken adımları:

find . -name '*.java' -exec vim +'%s/OldName/NewName/gc' +'wq' {} \; 

yani tüm "* .java" dosyalarında "YeniAd" ile "eskiad" yerine, ama beni istemi Her ikame için onay için.

+0

Teşekkürler! Perl'i kullanırken bunu nasıl yapıyorsun? – nab

+0

'Bul. -name '* .java' -exec perl -i.BAK -wpe '/ OldName/NewName/g' {} \; 'eski dosyayı bir" .BAK "uzantısıyla kaydeder, böylece değişiklikleri 'ile inceleyebilirsiniz. diff'. – Manish

İlgili konular