2012-05-04 3 views
5

ich folgende für mehrere Dateien mit Vim tun will:Vim: Für mehrere Dateien: Kopieren Sie alle Text, Ersetzen und Einfügen

  1. Kopieren Sie alle Text in jeder Datei
  2. ersetzen einig Text
  3. Paste der kopierte Text am Ende der jeweiligen Datei
  4. Ersetzen Sie einen anderen Text

meine Befehle für eine Datei befinden sich hier:

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

Kann mir jemand die Syntax dazu sagen? Vor allem, dass ich neu in Vim bin!

Ich fand heraus, dass Argdo Befehle auf mehrere Dateien ausführen kann. Ich fand viele Beispiele, um argdo beim Ersetzen von Text zu verwenden, aber ich konnte die Syntax nicht finden, um argdo mit zu verwenden:% y,: G, oder: P

Danke.

Antwort

4

Wie @ib erwähnt, ich dies tun würde, mit ex-Befehle

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

Es gibt auch eine gute Chance, dass Sie sich auf exklusive Bereichen arbeiten möchten (tun die erste Substitution nur auf der ersten Teil und die zweite nur auf dem zweiten):

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

nicht passende Substitutionen zu ermöglichen, fügen Sie s///e und silent! Additions-Operation viel schneller im Fall vielen Dateien zu machen.

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

(beachten Sie, dass argdo erwartet eine Ex-Befehlsliste standardmäßig aktiviert. Sie zB argdo norm! ggyG verwenden würde normalen Modus verwenden Befehle)

+0

Das ist großartig! Es funktioniert Ich habe gerade hinzugefügt | w zum ersten Befehl : argdo% y | % s/alt1/neu1/g | $ pu | % s/alt2/neu2/g | w – Pansy

+1

@Pansy. Stimmt. Guter Ruf. Ich habe immer ': se autowrite autoread' aktiviert (ich habe hartnäckige Rückgängig und Versionskontrolle für den Rest sowieso) – sehe

+1

Im Falle der Anforderung, jede der beiden Ersetzungen nur auf einer Kopie des Originaltextes auszuführen, kann man das Setzen einer Markierung vermeiden manuell: ': argdo% y |% s/o1/n1/g | $ pu | '[, $ s/o2/n2/g'. –

3

UPD: mein Vim-fu ist nicht so stark wie @ibs oder @sehes, also könnten Sie die Lösungen, die sie vorgeschlagen haben, anstelle meiner verwenden.

Aber meine Lösung ist einfacher zu bearbeiten und zu debuggen persönlich für mich (als Vim Lehrling), also, lass es hier sowieso sein.


Sie können die folgende temporäre Funktion in Ihrem hinzufügen vimrc:

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

Dann starten Vim mit den Dateien, die Sie beeinflussen müssen (so etwas wie vim myfile1.txt myfile2.txt myfile3.txt), und führen Sie den folgenden Befehl ein:

:argdo call MyTmpFunc()

Das haben Sie in Ihrer Frage beschrieben: Funktion MyTmpFunc() w Für jedes Argument, das Vim gegeben wird, muss man mich anrufen.

Jetzt können Sie MyTmpFunc() von vimrc löschen.

Beachten Sie auch mit :bufdo - es ruft einen Befehl für jeden geöffneten Puffer. Es gibt auch :windo, der Befehl für jedes Fenster ausführt, aber persönlich fand ich :bufdo das nützlichste.

Beachten Sie auch, dass Sie keine temporäre Funktion erstellen müssen, wenn Sie nur einen einzigen Befehl in jedem Puffer ausführen müssen. Sprich, wenn Sie gerade brauchen „old1“ auf „new1“ in jedem Puffer zu ersetzen, dann können Sie den folgenden Befehl ausführen:

:bufdo %s/old1/new1/g

und das ist es.

+4

Eine nicht temporäre Funktion erstellen hat um mehrere Ex-Befehle auszuführen: ': argdo% y |% s/o1/n1/g | $ pu |% s/o2/n2/g'. –

+0

@ib wie immer ib, das hätte eine Antwort verdient. Ich habe einige weitere Ideen in meiner – sehe

+0

@ib hinzugefügt. Ja, mein Vim-fu ist nicht so stark, mein Schlechter. Aber die Art, wie ich es vorgeschlagen habe, ist einfacher für mich persönlich zu bearbeiten und zu debuggen (als Vim-Lehrling), also lass es trotzdem hier sein. (Ich aktualisierte meine Antwort auch) –

Verwandte Themen