Wie kann ich eine Funktion oder ein Makro in einem Ordner mit Dateien ausführen?

11

Angenommen, ich habe eine Funktion namens StripWhitespace.

Ich kann es auf einer einzelnen Datei ausführen, indem ich die Datei öffne und ausführe :StripWhitespace.

Wie kann ich diese Funktion automatisch für einen Ordner mit Dateien ausführen und die Ergebnisse im weiteren Verlauf speichern?

Quadratfrosch
quelle
3
Details bitte!
200_erfolg

Antworten:

9

Mit dem -cArgument können Sie beim Start einen Befehl ausführen vim(1):

   -c {command}
               {command} will be executed after the first  file  has  been
               read.   {command}  is interpreted as an Ex command.  If the
               {command} contains spaces it must  be  enclosed  in  double
               quotes  (this depends on the shell that is used).  Example:
               Vim "+set si" main.c
               Note: You can use up to 10 "+" or "-c" commands.

Beispiel:

vim -c ':call StripWhitespace()' file1 file2

Um danach zu beenden, fügen Sie hinzu | :wqa:

vim -c ':call StripWhitespace() | :wqa' file1 file2
Martin Tournoij
quelle
1
Sie möchten ein: argdo, wenn Sie dies für ein paar Dateien auf der Kommandozeile ausführen
Christian Brabandt
18

Wenn Sie sich bereits in Vim befinden, können Sie mit den Befehlen :argdooder :bufdoeinen Befehl für jedes Element in der Argumentliste bzw. Pufferliste ausführen.

zB um einen :Befehl für jede Datei in der Argumentliste auszuführen :

:argdo StripWhitespace

Oder um eine Funktion aus jeder Datei in der Pufferliste aufzurufen:

:bufdo call StripWhitespace()

Oder um ein Makro qfür jede Datei in der Argumentliste auszuführen :

:argdo normal @q

Sie können dann alle geänderten Puffer mit :wallspeichern oder alle speichern und Vim mit beenden :wqall.

Wenn Sie die Dateien im Laufe der Zeit schreiben möchten, können Sie in einem Aufruf Folgendes hinzufügen :update:

:argdo s/foo/bar/ge | update

Es gibt verschiedene Möglichkeiten, wie Sie die Dateien in Vim einbinden können, darunter:

  • Geben Sie Parameter in die vim-Befehlszeile ein: vim *(Dadurch werden alle Dateien zur Argumentliste hinzugefügt.)
  • Verwenden Sie den :argsBefehl (der Platzhalter und Backtick-Ausdrücke unterstützt), um die Argumentliste zu füllen, oder den :argaddBefehl, um Dateien hinzuzufügen.
  • Öffnen Sie sie einfach alle manuell mit :e, :Exoder eine Datei-Öffnen - Plugin.
Reich
quelle
1
Ich mag diese Antwort, weil es nicht erforderlich ist, Vim zu verlassen, was meiner Meinung nach zu teuer ist (meine wertvolle Pufferliste!). Ich habe einige Anmerkungen: (1) Das Verlassen von Puffern ohne Schreiben muss 'hidden'eingestellt werden. (2) Der : updateBefehl ist eine leichte Verbesserung gegenüber dem Befehl, :wda er nur schreibt, wenn eine Änderung vorgenommen wurde, :bufdo updateoder :argdo updatealle geänderten Puffer oder Argumente schreibt.
Tommcdo
Guter Punkt auf update. Ich überlegte zu erwähnen, hiddenwann ich die Antwort schrieb, entschied mich aber dagegen, weil ich sie nicht überkomplizieren wollte. Nachdenklich sollte es dort drin sein. Ich werde die Antwort so aktualisieren, dass sie beide Vorschläge enthält.
Rich
@tommcdo Habe gerade die Dokumentation auf: wall überprüft und es werden nur geänderte Puffer geschrieben, so dass: ein Bufdo-Update ist schließlich nicht erforderlich.
Rich
Guter Fang in Bezug auf :wall, was auch den Vorteil hat, nicht durch Puffer zu radeln und Sie von Ihrem Ausgangspunkt wegzubringen. Ich nehme an, es :argdo updateist immer noch eine andere Geschichte - vielleicht möchten Sie nicht in Puffer schreiben, die nicht in Ihrer Argumentationsliste enthalten sind.
Tommcdo
@tommcdo Guter Punkt.
Rich