*usr_26.txt* Für Vim Version 8.1. Letzte Änderung: 24.Apr.2006 VIM-BENUTZERHANDBUCH - von Bram Moolenaar Wiederholen Eine Editieraufgabe ist selten unstrukturiert. Oft muss eine Änderung mehrmals vorgenommen werden. In diesem Kapitel werden eine Reihe nützlicher Wege, um eine Änderung zu wiederholen, erklärt. |26.1| Mit dem visuellen Modus wiederholen |26.2| Addieren und substrahieren |26.3| Eine Änderung in vielen Dateien machen |26.4| Vim aus einem Shell-Skript verwenden Nächstes Kapitel: |usr_27.txt| Suchbefehle und -muster Vorheriges Kapitel: |usr_25.txt| Formatierten Text editieren Inhaltsverzeichnis: |usr_toc.txt| =========================================================================== *26.1* Mit dem visuellen Modus wiederholen Der visuelle Modus ist sehr praktisch, um eine Änderung in einer Folge von Zeilen vorzunehmen. Sie können den hervorgehobenen Text sehen, so dass Sie überprüfen können, ob die richtigen Zeilen geändert werden. Das Auswählen erfordert jedoch einiges Tippen. Der Befehl »gv« wählt denselben Bereich erneut aus. Die erlaubt es Ihnen, eine weitere Operation auf demselben Text auszuführen. Angenommen, Sie haben einige Zeilen, in denen Sie »2001« in »2002« ändern möchten und »2000« in »2001«: Die Finanzergebnisse für 2001 sind besser ~ als im Jahr 2000. Das Einkommen stieg um 50%, ~ obwohl 2001 mehr regnete als 2000. ~ 2000 2001 ~ Einkommen 45.403 66.234 ~ Ändern Sie zuerst »2001« in »2002«. Wählen Sie die Zeilen im visuellen Modus aus und verwenden Sie: > :s/2001/2002/g Verwenden Sie nun »gv«, um denselben Text erneut auszuwählen. Es ist egal, wo der Cursor ist. Verwenden Sie dann »:s/2000/2001/g«, um die zweite Änderung vorzunehmen. Offensichtlich können Sie diese Änderungen mehrmals wiederholen. =========================================================================== *26.2* Addieren und substrahieren Wenn Sie die Änderung einer Nummer in eine andere wiederholen, haben Sie häufig einen festen Versatz. Im obigen Beispiel wurde jedem Jahr eins hinzugefügt. Anstatt einen Ersatzbefehl für jedes Jahr, das angezeigt wird, zu tippen, kann der Befehl CTRL-A verwendet werden. Suchen Sie den gleichen Text wie oben verwendend nach einem Jahr: > /19[0-9][0-9]\|20[0-9][0-9] Drücken Sie jetzt CTRL-A. Das Jahr wird um eins erhöht: Die Finanzergebnisse für 2002 sind besser ~ als im Jahr 2000. Das Einkommen stieg um 50%, ~ obwohl 2001 mehr regnete als 2000. ~ 2000 2001 ~ Einkommen 45.403 66.234 ~ Verwenden Sie »n«, um das nächste Jahr zu suchen, und drücken Sie ».«, um CTRL-A zu wiederholen (».« ist ein wenig schneller zu tippen). Wiederholen Sie »n« und ».« für alle Jahre, die erscheinen. Hinweis: Aktivieren Sie die Option 'hlsearch', um die Übereinstimmungen anzuzeigen, die Sie ändern möchten, dann können Sie nach vorne schauen und es schneller machen. Sie können mehr als eins hinzufügen, indem Sie CTRL-A eine Anzahl voranstellen. Angenommen, Sie haben diese Liste: 1. Punkt vier ~ 2. Punkt fünf ~ 3. Punkt sechs ~ Bewegen Sie den Cursor auf "1". und tippen Sie: > 3 CTRL-A Die »1.« ändert sich zu »4.«. Auch hier können Sie ».« verwenden, um dies auf den anderen Zahlen zu wiederholen. Ein anderes Beispiel: 006 foo bar ~ 007 foo bar ~ Die Verwendung von CTRL-A für diese Zahlen führt zu: 007 foo bar ~ 010 foo bar ~ 7 plus eins ist 10? Was hier passiert ist, ist, dass Vim "007" als Oktalzahl erkannt hat, weil es eine führende Null gibt. Diese Notation wird häufig in C-Programmen verwendet. Wenn Sie nicht möchten, dass eine Zahl mit führenden Nullen als oktal behandelt wird, verwenden Sie dies: > :set nrformats-=octal Der Befehl CTRL-X subtrahiert auf ähnliche Weise. =========================================================================== *26.3* Eine Änderung in vielen Dateien machen Angenommen, Sie haben eine Variable mit dem Namen »x_cnt« und möchten sie in »x_counter« ändern. Diese Variable wird in mehreren Ihrer C-Dateien verwendet. Sie müssen es in allen Dateien ändern. Dies ist wie man es macht. Fügen Sie alle relevanten Dateien in die Argumentliste ein: > :args *.c < Dies findet alle C-Dateien und editiert die erste. Jetzt können Sie einen Ersetzungsbefehl für alle diese Dateien durchführen: > :argdo %s/\/x_counter/ge | update Der Befehl »:argdo« nimmt einen anderen Befehl als Argument. Dieser Befehl wird für alle Dateien in der Argumentliste ausgeführt. Der folgende Ersatzbefehl »%s« wird für alle Zeilen ausgeführt. Er findet das Wort »x_cnt« mit »\«. Die »\<" und »\>« werden verwendet, um das ganze Wort zur Übereinstimmung zu bringen und nicht »px_cnt« oder »x_cnt2«. Die Schalter für den Ersatzbefehl enthalten »g«, um alle Vorkommen von »x_cnt« in der gleichen Zeile zu ersetzen. Der Schalter »e« wird verwendet, um eine Fehlermeldung zu vermeiden, wenn »x_cnt« nicht in der Datei erscheint. Sonst würde »:argdo« bei der ersten Datei abbrechen, in der »x_cnt« nicht gefunden wurde. Das »|« trennt zwei Befehle. Der folgende »Update«-Befehl schreibt die Datei nur, wenn sie geändert wurde. Wenn kein »x_cnt« in »x_counter« geändert wurde, geschieht nichts. Es gibt auch den Befehl »:windo«, der sein Argument in allen Fenstern ausführt. Und »:bufdo« führt sein Argument für alle Puffer aus. Seien Sie vorsichtig mit diesem, weil Sie möglicherweise mehr Dateien in der Pufferliste haben, als Sie denken. Überprüfen Sie dies mit dem Befehl »:buffers« (oder »:ls«). =========================================================================== *26.4* Vim aus einem Shell-Skript verwenden Angenommen, Sie haben viele Dateien, in denen Sie die Zeichenfolge »-Person-« zu »Jones« ändern und sie dann ausdrucken müssen. Wie machen Sie das? Ein Weg ist viel Tipperei. Der andere ist, ein Shell-Skript zu schreiben, um die Arbeit zu erledigen. Der Vim-Editor leistet hervorragende Arbeit als bildschirmorientierter Editor bei der Verwendung von Befehlen im Normalmodus. Für die Stapelverarbeitung ergeben jedoch die Befehle für den Normalmodus keine klaren, kommentierten Befehlsdateien; hier verwenden Sie stattdessen den Ex-Modus. Dieser Modus bietet Ihnen eine schöne Befehlszeilenschnittstelle, die es einfach macht eine Stapelverarbeitungsdatei zu schreiben. (»Ex-Befehl« ist nur ein anderer Name für Befehlszeilenbefehl (:).) Die Ex-Modusbefehle, die Sie brauchen, lauten wie folgt: > %s/-Person-/Jones/g write Temporärdatei quit Sie fügen diese Befehle in die Datei »Änderung.vim« ein. Um nun den Editor im Stapelverarbeitungsmodus auszuführen, verwenden Sie nun das folgende Shell-Skript: > for Datei in *.txt; do vim -e -s $Datei < Änderung.vim lpr -r Temporärdatei done Die for-done-Schleife ist ein Shell-Konstrukt, mit dem die beiden Zeilen dazwischen wiederholt werden. Dabei wird die Variable $Datei jedes Mal auf einen anderen Dateinamen gesetzt. In der zweiten Zeile wird der Vim-Editor im Ex-Modus (Argument -e) für die Datei $Datei ausgeführt und liest Befehle aus der Datei »Änderung.vim«. Das Argument -s sagt Vim, im lautlosen Modus zu arbeiten. Mit anderen Worten, kein :prompt oder eine andere Eingabeaufforderung für diesen Fall auszugeben. Der Befehl »lpr -r Temporärdatei« druckt die resultierende »Temporärdatei« aus und löscht sie (das ist, was das Argument -r tut). LESEN VON DER STANDARDEINGABE Vim kann Text von der Standardeingabe lesen. Da der normale Weg ist, von dort Befehle zu lesen, müssen Sie Vim anweisen, stattdessen Text zu lesen. Dies geschieht durch Angabe des Arguments »-« anstelle einer Datei. Beispiel: > ls | vim - Auf diese Weise können Sie die Ausgabe des Befehls »ls« editieren, ohne den Text vorher in einer Datei zu speichern. Falls Sie die Standardeingabe zum Lesen von Text verwenden, können Sie das Argument »-S« verwenden, um ein Skript zu lesen: > Produzent | vim -S Änderung.vim - NORMALMODUSSKRIPTE Falls Sie wirklich Normalmodusbefehle in einem Skript verwenden möchten, können Sie es so machen: > vim -s Skript Datei.txt ... < Anmerkung: »-s« hat eine andere Bedeutung, wenn es ohne »-e« verwendet wird. Hier bedeutet es, dass das »Skript« als Normalmodusbefehle eingelesen wird. Bei Verwendung mit »-e« bedeutet es schweigen und verwendet das nächste Argument nicht als Dateiname. Die Befehle im »Skript« werden so ausgeführt, als wenn Sie sie getippt hätten. Vergessen Sie nicht, dass ein Zeilenumbruch als Drücken der Taste interpretiert wird. Im Normalmodus bewegt das den Cursor in die nächste Zeile. Um das Skript zu erstellen, können Sie die Skriptdatei bearbeiten und die Befehle tippen. Sie müssen sich vorstellen, was das Ergebnis sein würde, was ein bisschen schwierig sein kann. Eine andere Möglichkeit besteht darin, die Befehle aufzuzeichnen, während Sie sie manuell ausführen. Dies machen Sie so: > vim -w Skript Datei.txt ... Alle getippten Tasten werden ins »Skript« geschrieben. Falls Sie einen kleinen Fehler machen, können Sie einfach weitermachen und daran denken, das Skript später zu editieren. Das Argument »-w« hängt an ein vorhandenes Skript an. Das ist gut wenn Sie das Skript Stück für Stück aufzeichnen möchten. Wenn Sie von vorne anfangen und neu beginnen möchten, benutzen Sie das Argument »-W«. Es überschreibt alle vorhandenen Dateien. =========================================================================== Nächstes Kapitel: |usr_27.txt| Suchbefehle und -muster Copyright: siehe |manual-copyright| vim:tw=78:ts=8:noet:ft=help:norl: