2012-05-04 12 views
5

yapıştırın: Bazı metni değiştirin Vim: Çoklu Dosyalar için: Tüm Metni kopyalayıp değiştirin ve Vim kullanarak birden dosyalar için aşağıdaki yapmak istiyorum

  • Yapıştır

    1. Kopya her dosya
    2. tüm metin her dosyanın
    3. sonunda kopyalanan metni Burayı

    bir dosya için benim komutlardır diğer bazı metni değiştirin:

    :%y 
    :%s/old1/new1/g 
    :G 
    :P 
    :%s/old2/new2/g 
    

    Herhangi biri bana böyle bir sözdizimi söyler mi? Özellikle de Vim için yeniyim!

    Argdo'nun birden çok dosya üzerinde komut çalıştırabildiğini öğrendim. Ben metin değiştirme argdo kullanmak için birçok örnek buldum, ama ben argdo kullanmak için sözdizimi bulamadı:% y,: G, veya: P

    Teşekkürler.

  • cevap

    4

    , size özel aralıkları üzerinde işlem isteyebilirsiniz iyi bir şans (yalnızca ilk on birinci ikame yapmak da var

    :argdo %y | %s/old1/new1/g | $pu | %s/old2/new2/g 
    

    komutları bölüm ve sadece ikinci ikinci):

    :argdo $mark a | %co$ | 1,'a s/old1/new1/g | 'a,$s/old2/new2/g 
    

    , eşleşmeyen değiştirmelerin izin s///e ekleyip çok daha hızlı birçok dosya halinde operasyon yapmaya silent! ekleyin.


    :silent! argdo $mark a | %co$ | 1,'a s/old1/new1/ge | 'a,$s/old2/new2/ge 
    
    (argdo not varsayılan olarak Ex komut listesini ister. Normal modunu kullanmak örn argdo norm! ggyG kullanmayı tercih ediyorum komutları)

    Bir geçici işlev oluşturmak zorunda değildir
    +0

    'u yeniden başlatmadan argüman listesini ayarlamak için': args myfile? .txt' kullanın. Bu harika! çalışıyor Sadece 1 komutunu : w ekledim: argdo% y | % s/old1/new1/g | $ pu | % s/old2/new2/g | w – Pansy

    +1

    @Pansy. Doğru. İyi arama. Ben her zaman: autowrite autoread özelliği var (Ben zaten geri kalanı için kalıcı bir geri alma ve sürüm kontrolü var) – sehe

    +1

    Her ikisinin orijinal metin bir kopyasını çalıştırmak için gereksinimi durumunda, bir işareti ayarlama önleyebilirsiniz el ile: ': argdo% y |% s/o1/n1/g | $ pu | '[, $ s/o2/n2/g'. –

    3

    UPD: benim Vim-Fu @ İb'ler veya @ sehe en olanlar kadar güçlü değildir, bu nedenle bunun yerine maden birinin önerilen çözümleri kullanmak isteyebilirsiniz. Ancak, benim çözümüm kişisel olarak benim için (Vim çırağı olarak) düzenlemek ve hata ayıklamaktan daha kolaydır, bu yüzden, yine de burada olmasına izin verin.


    Sen aşağıdaki geçici işlev eklemek edebilirsiniz vimrc:

    :

    function! MyTmpFunc() 
        :%y 
        :%s/old1/new1/g 
        normal! G 
        normal! P 
        :%s/old2/new2/g 
    endfunction 
    

    Sonra aşağıdaki komutu size (vim myfile1.txt myfile2.txt myfile3.txt gibi bir şey) etkiler için gereken dosyaları ile Vim yeniden başlatın ve yürütmek

    :argdo call MyTmpFunc()

    Sorunuzda anlattığınız şey budur: işlev MyTmpFunc() w Vim'e verilen her argüman için hasta aranmalıdır.

    Artık vimrc'den MyTmpFunc() öğesini silebilirsiniz.

    :bufdo ile de dikkat edin - her bir açık tampon için bazı komutlar çağırır. Ayrıca, her pencere için komut yürüten :windo da var, ama kişisel olarak en yararlı olan :bufdo'u buldum.

    Ayrıca, her bir arabelleğe yalnızca tek bir komut yürütmeniz gerekiyorsa geçici işlev oluşturmanız gerekmediğini lütfen unutmayın.

    :bufdo %s/old1/new1/g

    ve bu kadar: Her tampon içerisinde etmek "new1" "old1" yerine sadece gerekiyorsa o zaman aşağıdaki komutu çalıştırabilirsiniz, Say.Ben eski sevgilinle bu yapardım sözü @ib gibi

    +4

    Birkaç Ex komutunu çalıştırmak için: ': argdo% y |% s/o1/n1/g | $ pu |% s/o2/n2/g'. –

    +0

    @ib her zamanki gibi, bir cevap olmayı hak etmişti. Daha fazla fikir ekledim – sehe

    +0

    @ib. Evet, Vim-fu'm çok güçlü değil, benim kötü. Ancak, önerdiğim şekilde kişisel olarak benim için (Vim çırağı olarak) düzenleme ve hata ayıklama daha kolay, bu yüzden, yine de burada olsun. (Cevabımı da güncelledim) –